Создать и прочитать временный файл с Bazel

Я пытаюсь настроить свою систему сборки для TensorFlow, используя Bazel. Мне нужно создать временный файл на этапе настройки, который я буду использовать в качестве кэша на этапе построения. Я смог создать его в моем файле.bzl с помощью:

repository_ctx.file(filename)

И после настройки я вижу, что это внутри папки:

$HOME/.cache/bazel/_bazel_$USERNAME/%MD5%/external/%repository_name%

где repository_name на самом деле repository_ctx.name

Но я не могу получить доступ к этому пути из моего скрипта.tpl во время сборки. Я хотел отправить его из сценария.bzl через замены repository_ctx.template но даже здесь я не нашел, как найти этот путь!

Не похоже, что я могу получить доступ к этой папке, используя символические ссылки, такие как bazel-out или bazel-genfiles (что звучит очень многообещающе, но не...). Я также не смог создать файл за пределами этой папки.

Это очень простая проблема, и я просто не могу поверить, что нет другого способа, кроме как жестко закодировать путь или find Это...

1 ответ

Решение

Я предполагаю, что проблема в том, что вы не выставляете файл в файле BUILD репозитория, чтобы ваша сборка могла его использовать. Вам нужно сделать что-то вроде:

repository_ctx.file('whatever')
repository_ctx.file('BUILD', 'exports_files(["whatever"])')

Тогда вы можете использовать @repository_name//:whatever в любом другом файле BUILD.

export_files используется для того, чтобы пакеты зависели от исходных файлов других пакетов.

Затем в файле.bzl, который вы загружаете во время сборки, добавьте файл в качестве атрибута, например,

attrs = {
    '_my_external_src' : attr.label(
        default = Label('@my_repository//:whatever'),
        allow_single_file = True,
    ),
},

Затем в реализации правила вы можете получить к нему доступ через контекст:

def _impl(ctx):
    print(ctx.file._my_external_src.path)

.path получает путь к файлу.

Другие вопросы по тегам