В Starlark, как мне сгенерировать файл, связанный с исполняемыми файлами?
В файле Starlark, который используется в Bazel, если я создаю файл с ctx.actions.declare_file()
Есть ли какой-нибудь способ связать с ним зависимости /datafiles/runfiles? Например:
Я могу создать и записать в файл:
script_file = ctx.actions.declare_file("myscript.sh")
ctx.actions.write(
script_file,
"echo hello from myscript.sh\n",
is_executable = True
)
... и тогда я могу использовать script_file
любым способом я хочу. Например в ctx.actions.run
или же ctx.actions.run_shell
,
Теперь предположим myscript.sh
зависит от data.txt
:
data_file = ctx.actions.declare_file("data.txt")
ctx.actions.write(data_file, "hello from data.txt\n")
script_file = ctx.actions.declare_file("myscript.sh")
ctx.actions.write(
script_file,
"cat {}\n".format(data_file.path),
is_executable = True
)
И тогда я могу запустить его (в этом примере правило, которое вызвало это, имеет вывод с именем "main"):
ctx.actions.run_shell(
tools = [script_file, data_file],
outputs = [ctx.outputs.main],
command = "{} > {}".format(script_file.path, ctx.outputs.main.path)
)
Хорошо. Но на самом деле это грязно, чтобы указать оба script_file
а также data_file
в tools
массив. Я хотел бы указать только script_file
и иметь data_file
автоматически выбирается как файл запуска script_file
,
Есть ли способ для этого? Если так, то как? Если нет, есть ли другой, лучший способ для меня, чтобы приблизиться к этому?