我在Bazel中有一个genrule
,应该可以操纵某些文件。我想我没有通过正确的路径访问这些文件,所以我想看看Bazel正在创建的目录结构,以便进行调试。
我在自己的风格中添加了一些echo
语句,我可以看到Bazel正在目录/home/lyft/.cache/bazel/_bazel_lyft/8de0a1069de8d166c668173ca21c04ae/sandbox/linux-sandbox/1/execroot/
中工作。但是,在Bazel完成运行之后,该目录已消失,因此我无法查看目录结构。
如何防止Bazel删除其临时文件以便调试发生的情况?
答案 0 :(得分:6)
由于此问题是“在构建框架后保留沙箱文件”的最佳结果 Google搜索和接受的答案中的it wasn't obvious for me,因此,我认为需要编写此答案。
>使用--sandbox_debug
。如果传递了此标志,则构建完成后,Bazel将不会删除沙箱文件夹中的文件。
使用--sandbox_debug
选项运行bazel构建:
$ bazel build mypackage:mytarget --sandbox_debug
然后,您可以检查项目的沙箱文件夹中的内容。
要获取当前项目的沙箱文件夹的位置,请导航至项目,然后运行:
$ bazel info output_base
/home/johnsmith/.cache/bazel/_bazel_johnsmith/d949417420413f64a0b619cb69f1db69 # output will be something like this
在该目录内将有sandbox
文件夹。
可能的警告:(对此我不确定,但是)sandbox
文件夹中可能缺少某些文件,如果您以前运行的是没有{{1 }}标志,它部分成功。原因是Bazel不会重新运行已经成功构建的部分,因此,与成功构建部分相对应的文件可能不会在沙箱中结束。
如果要确保所有沙箱文件都在其中,请先使用--sandbox_debug
或bazel clean
清洁项目。
答案 1 :(得分:2)
您可以使用--spawn_strategy=standalone
。
您还可以使用--sandbox_debug
来查看将哪些目录安装到沙箱。
您还可以将genrule的cmd设置为find . > $@
,以调试该genrule可用的内容。
重要提示:声明该类将读取/写入/使用的所有srcs / outs / tools,并使用$(location //label/of:target)
查找其路径。示例:
genrule(
name = "x1",
srcs = ["//foo:input1.txt", "//bar:generated_file"],
outs = ["x1out.txt", "x1err.txt"],
tools = ["//util:bin1"],
cmd = "$(location //util:bin1) --input1=$(location //foo:input1.txt) --input2=$(location //bar:generated_file) --some_flag --other_flag >$(location x1out.txt) 2>$(location x1err.txt)",
)