如何标记Bazel目标,使其默认不构建仅显式指定时构建?
解决Bazel默认构建时跳过特定目标的方法
刚好我之前也遇到过类似的需求,不想让某些cc_library在执行bazel build ...时被自动构建,只在显式指定目标路径时才编译。这里给你几个实用的方案:
1. 使用manual标签(最推荐)
Bazel有一个专门的manual标签,用来标记那些不需要被默认构建流程包含的目标。只要给你的cc_library加上这个标签,它就不会出现在bazel build ...的默认构建列表里,只有当你显式指定目标(比如bazel build //a/b/c:foo)时才会被构建。
示例代码:
cc_library( name = "foo", srcs = ["foo.cc"], hdrs = ["foo.h"], tags = ["manual"], # 核心配置 )
这个方案的优势在于语义清晰,完全贴合你的需求——它就是为了区分“需要手动触发构建”的目标而设计的,不会影响目标的可见性或其他功能。
2. 限制目标的可见性
如果你的目标本来就只需要被特定包引用,也可以通过visibility属性来间接实现默认不构建的效果。比如将目标设为私有可见性,或者仅对指定包开放:
私有可见性示例
cc_library( name = "foo", srcs = ["foo.cc"], hdrs = ["foo.h"], visibility = ["//visibility:private"], # 仅当前包可访问 )
这种情况下,其他包无法引用这个目标,bazel build ...也不会把它纳入默认构建范围。不过要注意,这个方案的核心是权限控制,如果你只是单纯不想默认构建,manual标签会更合适。
3. 用package_group精细化控制可见性
如果需要更灵活的可见性规则,可以定义package_group来指定允许引用该目标的包集合,这样默认构建时也不会触发它的编译:
package_group( name = "allowed_packages", packages = [ "//some/allowed/package", "//another/allowed/package", ], ) cc_library( name = "foo", srcs = ["foo.cc"], hdrs = ["foo.h"], visibility = [":allowed_packages"], )
这个方案适合需要严格控制目标引用范围的场景,但配置相对复杂一些。
总结一下,优先选择manual标签,它是最直接且语义明确的解决方式,完全匹配你“仅显式构建”的需求。
内容的提问来源于stack exchange,提问作者bodihex
相关产品推荐
相关产品推荐

