Как получить объект файла для файла, созданного в execpath в Bazel? - PullRequest
1 голос
/ 20 апреля 2020

У меня есть сценарий bash:

mkdir a_dir
echo "Hello World!" > a_dir/out1.txt
echo "Hello World!" > a_dir/out2.txt

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

Проблема в том, что я не могу понять, как ссылаться на файлы погоды с помощью ctx.actions.declare_file или каким-либо другим способом, о котором я не знаю.

Я думаю, что мне нужен метод для получения File объектов, которые ссылаются на файлы по пути execroot.

Примечание: фактический двоичный файл, который я буду использовать вместо Сценарий bash не предоставляет контроль над путем его вывода, поэтому объявление файла в функции реализации и передача его в качестве параметра в двоичный файл не вариант.

1 Ответ

0 голосов
/ 24 апреля 2020

После просмотра в Интернете и открытия темы на bazel-Discussion кажется, что нет никакого способа объявить выходные данные вне вывода root.

Решение I выбрано создание сценария-оболочки, который cd s в выходной каталог out_dir, который оценивается как paths.join(ctx.bin_dir.path, ctx.label.package)

Обсуждается причина, по которой я выбрал cd, а не mv или cp в обсуждении bazel.

После cd в out_dir пути файлов, передаваемых двоичному файлу в качестве аргументов, больше не действительны, и их можно исправить, добавив к ним .. s. Если файлы, которые должны быть исправлены, находятся в depset, и вам требуется исправить пути без преобразования depset в список, вы можете добавить фиксированное значение пути, используя параметр format_each args.add_all().

Это не самое элегантное решение, но, насколько я знаю, не ставит под угрозу функциональность. Вот пример кода:

# Inside implementation function:
out_dir = paths.join(ctx.bin_dir.path, ctx.label.package)
path_fix = "/".join(len(out_dir.split("/"))*[".."])
args = ctx.actions.args()
args.add_all(files_depset, format_each=path_fix+"/%s")
ctx.actions.run_shell(..., command = "cd {out_dir}; {binary} $@".format(
    out_dir = out_dir,
    binary = your_binary
))
...