如何将文件写入当前目录而不是打包

Ani*_*sto 5 c++ file-io rules output bazel

我有以下目录结构:

my_dir
|
 --> src
|    |
|     --> foo.cc
|     --> BUILD
|
 --> WORKSPACE
|
 --> bazel-out/ (symlink)
| 
| ...
Run Code Online (Sandbox Code Playgroud)

src/BUILD 包含以下代码:

cc_binary(
    name = "foo",
    srcs = ["foo.cc"]
)
Run Code Online (Sandbox Code Playgroud)

该文件使用实用程序使用常规方式foo.cc创建一个命名文件。bar.txt<fstream>

但是,当我调用Bazel时,bazel run //src:foobar.txt创建并放置文件,bazel-out/darwin-fastbuild/bin/src/foo.runfiles/foo/bar.txt而不是将其放置在my_dir/src/bar.txt原始源所在的位置。

我尝试将一个outs字段添加到foo规则中,但是Bazel抱怨这outs不是的公认属性cc_binary

我还考虑过创建filegroup规则,但是没有deps字段可以声明foo为这些文件的依赖项。

如何确定cc_binary放置规则所生成的文件my_dir/src/bar.txt而不是bazel-out/...

Jin*_*Jin 7

Bazel 不允许您按照设计修改工作区的状态。

简短的回答是您不希望过去构建的结果修改您工作区的状态,因此可能会修改未来构建的结果。如果在同一工作区多次运行 Bazel 会导致不同的输出,则会违反可重复性。

给定你的例子:想象一下调用bazel run //src:foowhich inserts

#define true false
#define false true
Run Code Online (Sandbox Code Playgroud)

src/foo.cc. 如果你bazel run //src:foo再次打电话会发生什么?

长答案:https : //docs.bazel.build/versions/master/rule-challenges.html#assumption-aim-for-correctness-throughput-ease-of-use-latency

以下是有关输出目录的更多信息:https : //docs.bazel.build/versions/master/output_directories.html#documentation-of-the-current-bazel-output-directory-layout