Путь выполнения к файлу данных во внешнем репозитории

#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"))