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

如何为Bazel中的execpath中创建的文件获取文件对象?,bazel,Bazel,我有一个bash脚本: mkdir a_dir echo "Hello World!" > a_dir/out1.txt echo "Hello World!" > a_dir/out2.txt 我想创建一个操作来运行脚本,并将它创建的文件声明为输出,并且能够将它们作为输入传递给其他操作 问题是我不知道如何使用ctx.actions.declare\u file或我不知道的其他方法引用文件weather 我想我要寻找的是一种方法来获取引用execroot路径下文件的File对象 注

我有一个bash脚本:

mkdir a_dir
echo "Hello World!" > a_dir/out1.txt
echo "Hello World!" > a_dir/out2.txt
我想创建一个操作来运行脚本,并将它创建的文件声明为输出,并且能够将它们作为输入传递给其他操作

问题是我不知道如何使用
ctx.actions.declare\u file
或我不知道的其他方法引用文件weather

我想我要寻找的是一种方法来获取引用
execroot
路径下文件的
File
对象


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

在联机查看并打开一个线程之后,似乎没有任何方法在输出根之外声明输出

我选择的解决方案是创建一个包装器脚本,将
cd
s放入输出目录
out\u dir
,该目录的计算结果为
path.join(ctx.bin\u dir.path,ctx.label.package)

我选择
cd
而不是
mv
cp
的原因在bazel讨论线程中讨论

cd
into
out\u dir
之后,作为参数提供给二进制文件的文件路径不再有效,可以通过在它们前面加
来修复它们。
s。如果要修复的文件位于
depset
中,并且您需要在不将
depset
转换为列表的情况下修复路径,则可以使用
args.add\u all()的
format\u each
参数预先设置路径修复

这不是最优雅的解决方案,但据我所知,不会影响功能。下面是一些示例代码:

#内部实现功能:
out\u dir=path.join(ctx.bin\u dir.path,ctx.label.package)
path_fix=“/”.join(len(out_dir.split(“/”)))*[“.”
args=ctx.actions.args()
args.add_all(文件\u depset,格式\u each=path\u fix+“/%s”)
actions.run_shell(…,command=“cd{out_dir};{binary}$@”(
out\u dir=out\u dir,
二进制=你的_二进制
))

在联机查看并打开上的线程后,似乎没有任何方法在输出根之外声明输出

我选择的解决方案是创建一个包装器脚本,将
cd
s放入输出目录
out\u dir
,该目录的计算结果为
path.join(ctx.bin\u dir.path,ctx.label.package)

我选择
cd
而不是
mv
cp
的原因在bazel讨论线程中讨论

cd
into
out\u dir
之后,作为参数提供给二进制文件的文件路径不再有效,可以通过在它们前面加
来修复它们。
s。如果要修复的文件位于
depset
中,并且您需要在不将
depset
转换为列表的情况下修复路径,则可以使用
args.add\u all()的
format\u each
参数预先设置路径修复

这不是最优雅的解决方案,但据我所知,不会影响功能。下面是一些示例代码:

#内部实现功能:
out\u dir=path.join(ctx.bin\u dir.path,ctx.label.package)
path_fix=“/”.join(len(out_dir.split(“/”)))*[“.”
args=ctx.actions.args()
args.add_all(文件\u depset,格式\u each=path\u fix+“/%s”)
actions.run_shell(…,command=“cd{out_dir};{binary}$@”(
out\u dir=out\u dir,
二进制=你的_二进制
))

由于输出预期根在特定位置,是否可以选择编写一个包装器,该包装器接受这些
输出
参数,并在调用相关工具后将使用这些硬编码路径生成的结果复制/移动到声明的输出?我将在我将发布的问题答案中对此作出回应。由于输出预期在特定位置扎根,因此是否可以选择编写一个包装器,该包装器接受这些
输出
参数,并在调用问题中的工具后,将使用这些硬编码路径生成的结果复制/移动到声明的输出?我将在我将发布的问题答案中对此做出回应。