Bazel单规则内前序动作生成的文件能否供同规则后续动作使用
编辑说明:以下示例实际可以正常运行,我之前误读了编译器的输出,相关解答仍可能对部分用户有帮助。
Bazel同规则内多动作共享生成文件问题解答
你的实现思路没有问题,给出的示例代码本身就可以实现同规则内前置动作生成文件被后续动作消费的需求,你遇到的疑问本质是对Bazel的execroot路径映射逻辑的误解。
Bazel执行每一个动作前,都会自动把该动作声明的所有输入文件(包括源码目录的源文件、前置动作生成存放在bazel-out目录的文件)统一映射到execroot下的对应路径,不需要你手动调整生成文件的存储位置。
比如你在//demo/pkg包的规则内调用ctx.actions.declare_file("required_file.json")生成的文件,最终构建完成后会落盘到bazel-out的对应目录,但在run动作执行时,它在execroot内的路径就是demo/pkg/required_file.json,和同包下srcs、deps内的源文件路径完全一致,编译器在execroot环境下执行时可以正常读取到该文件。
如果实际运行中确实出现文件找不到的报错,可以按以下要点排查:
- 确认生成文件已经被正确添加到后续动作的inputs列表中,你示例中已经在inputs参数里加入了
[thefile],这部分写法是正确的 - 如果需要生成文件出现在execroot的指定子目录下,调用
declare_file时传入带相对路径的文件名即可,比如ctx.actions.declare_file("config/required_file.json"),对应execroot路径就会匹配同包下的config子目录 - 不要尝试让动作直接写入execroot的源码目录,Bazel的确定性构建要求所有生成文件必须输出到bazel-out目录,禁止直接修改源目录内容,强制修改路径会导致构建不通过。
你给出的示例代码已经符合规范,可直接运行:
def _example_rule_impl(ctx): thefile = ctx.actions.declare_file("required_file.json") ctx.actions.write( output = thefile, content = "CONTENT", ) args = ctx.actions.args() args.add("--config", thefile) ctx.actions.run( inputs = ctx.files.srcs + ctx.files.deps + [thefile], outputs = outs, arguments = [args], progress_message = "Compiling...", executable = ctx.executable._compiler, )
内容的提问来源于stack exchange,提问作者David Heuschmann
相关产品推荐
相关产品推荐

