Создать и прочитать временный файл с 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
получает путь к файлу.