如何获取在 Bazel 的 execpath 中创建的文件的文件对象?

How to get file object for file created in execpath in Bazel?

我有一个 bash 脚本:

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

我想为 运行 脚本创建一个动作,并将它创建的文件声明为输出,并能够将它们作为输入传递给其他动作。

问题是我不知道如何使用 ctx.actions.declare_file 或其他我不知道的方法来引用文件天气。

我想我正在寻找的是一种获取 File 对象的方法,这些对象引用 execroot 路径下的文件。

注意:我将 运行ning 而不是 bash 脚本的实际二进制文件不授予对其输出路径的控制权,因此在实现函数中声明一个文件并传递它作为二进制文件的参数不是一个选项。

在线查看并在 bazel-discuss 上打开一个线程后,似乎没有任何方法可以在输出根目录之外声明输出。

我选择的解决方案是创建一个包装脚本,该脚本 cd 进入输出目录 out_dir,计算结果为 paths.join(ctx.bin_dir.path, ctx.label.package)

我选择 cd 而不是 mvcp 的原因在 bazel-discuss 线程中进行了讨论。

cdout_dir 之后,作为参数提供给二进制文件的文件路径不再有效,可以通过在它们前面加上 .. 来修复。如果要修复的文件在 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
))