在Bazel中构建后如何避免删除缓存的文件

时间:2019-02-05 22:02:49

标签: bazel

我在Bazel中有一个genrule,应该可以操纵某些文件。我想我没有通过正确的路径访问这些文件,所以我想看看Bazel正在创建的目录结构,以便进行调试。

我在自己的风格中添加了一些echo语句,我可以看到Bazel正在目录/home/lyft/.cache/bazel/_bazel_lyft/8de0a1069de8d166c668173ca21c04ae/sandbox/linux-sandbox/1/execroot/中工作。但是,在Bazel完成运行之后,该目录已消失,因此我无法查看目录结构。

如何防止Bazel删除其临时文件以便调试发生的情况?

2 个答案:

答案 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_debugbazel 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)",
)