如何从生成的目标派生BUILD文件?

时间:2017-06-28 22:13:04

标签: bazel

我们的monolith repo看起来像这样:

├── bin
    └── ...
└── source
    ├── foo
        ├── BUILD
        └── ...
    └── bar
        ├── BUILD
        └── ...
    └── ...

我们有数以千计的BUILD文件在bin目录中生成数千个目标。

既然我们已经在bin目录中拥有了所有这些已编译的二进制文件,那么有一个方法可以派生出哪个BUILD文件放在那里。

我不想手工编写一个递归解析所有BUILD文件构建规则并打印答案的工具。这是用bazel查询可以实现的吗?

我们的大多数构建规则都非常典型:

cc_binary(
    name="foo",
    ...
)
py_binary(
    name="bar.py",
    ...
)

最终目标是运行类似:

where-source ./bin/foo
./source/foo/BUILD created ./bin/foo

1 个答案:

答案 0 :(得分:2)

如果您删除了bin/(我假设您正在使用--symlink_prefix?),则可以使用bazel query

# Where did bin/foo/bar/baz get defined?
$ bazel query foo/bar/baz
//foo/bar:baz

或者,要获取有关位置的详细信息:

$ bazel query --output=location foo/bar/baz
 /home/kchodorow/gitroot/proj/source/foo/bar/BUILD:3:1: go_binary rule //foo/bar:baz

或者,要获得目标本身的定义:

$ bazel query --output=build foo/bar/baz
go_binary(
    name = "baz",
    srcs = ["//foo/bar/baz.go"],
)

有关bazel query的更多示例,请参阅What build rule contains file src/main/java/com/example/cache/LRUCache.java as a source?以及该页面的其余部分。