#bazel
#bazel
Вопрос:
Допустим, у меня есть следующие два репозитория Bazel (репозиторий git):
repos
├── data
│ ├── BUILD.bazel
│ ├── external-data.txt
│ └── WORKSPACE
└── foo
├── BUILD.bazel
├── foo.py
├── local-data.txt
└── WORKSPACE
Я пытаюсь выяснить, как foo.py
скрипт из foo
репозитория может получить доступ external-data.txt
из data
репозитория во время выполнения.
До сих пор я настроил его так, чтобы data
репозиторий определял общедоступную группу файлов для external-data.txt
:
# data/BUILD.bazel
filegroup(
name = "data",
srcs = ["external-data.txt"],
visibility = ["//visibility:public"],
)
И foo
репозиторий объявляет data
репозиторий как зависимость…
# foo/WORKSPACE
local_repository(
name = "data",
path = "../data",
)
… и затем ссылается на файловую группу как на данные, которые будут использоваться во время выполнения для foo.py
:
# foo/BUILD.bazel
py_binary(
name = "foo",
srcs = ["foo.py"],
data = [
"local-data.txt",
"@data//:data"
]
)
Но, опять же, я не уверен, какой путь я должен использовать для доступа external-data.txt
во время выполнения:
# foo/foo.py
import os
def dump_file(file_path):
print(file_path ":")
with open(file_path) as file:
print(file.read())
def main():
data_files = [
'local-data.txt', # No problems here
# What path should I use to access @data//:external-data.txt?
]
for file in data_files:
dump_file(file)
print("cwd: " os.getcwd())
if __name__ == "__main__":
main()
Для контекста я использую Bazel версии 4.1.0 с --nolegacy_external_runfiles
флагом:
bazel run //:foo --nolegacy_external_runfiles --sandbox_debug
Вывод этой команды следующий:
local-data.txt:
foo
bar
baz
cwd: /home/$USER/.cache/bazel/_bazel_$USER/2da14ac18a4c150d41626b6c1957d2ad/execroot/__main__/bazel-out/k8-fastbuild/bin/foo.runfiles/__main__
Я не уверен, что это актуально, но когда я проверяю foo.py
выходные данные каталога как «cwd», я могу найти external-data.txt
файл по этому относительному пути:
../../../../../../../../../../../experiments/repos/data/external-data.txt
Какой следующий абсолютный путь:
/home/$USER/.cache/bazel/_bazel_$USER/2da14ac18a4c150d41626b6c1957d2ad/execroot/__main__/external/data
(Похоже, что обычно путь к внешним файлам должен быть примерно таким execroot/$WORKSPACE/external/$EXTERNAL_WORKSPACE
?)
Ответ №1:
runfiles.py заботится о поиске файлов запуска. Он обрабатывает запросы в различных ситуациях, включая запуск как runfile файла runfile, что сложно. В нем есть документация в комментарии вверху.
Чтобы использовать его, добавьте "@rules_python//python/runfiles"
в deps
оф foo
. Затем в foo.py
:
from rules_python.python.runfiles import runfiles
r = runfiles.Create()
print(r.Rlocation("data/data"))