如何通过Wrapper使py_proto_library支持tags=["manual"]标签?
问题与解决方案:py_proto_library无法正确处理manual标签
问题背景
protobuf仓库中的非官方py_proto_library规则存在缺陷:当设置tags = ["manual"]时,虽然标签能正确传递给生成的py_library目标,但内部的代码生成环节会忽略该标签。这导致执行bazel build //...这类通配构建时,带manual标签的目标依然会触发代码生成,无法被跳过。
尝试过用自定义宏包装官方规则,但方案过于极端——带manual标签的目标完全不会生成,无法单独构建。
可行解决方案
方案一:自定义宏实现标签继承
核心思路是让内部代码生成的genrule也继承传入的tags,确保manual标签在代码生成环节也生效。自定义宏代码如下:
load("@com_google_protobuf//:protobuf.bzl", "PROTO_PYTHON_DEPS") def py_proto_library(name, srcs, deps=[], visibility=None, tags=[], **kwargs): """支持manual标签的py_proto_library:通配构建跳过,可单独构建""" genrule_name = f"{name}_gen" proto_out_files = [src.replace(".proto", "_pb2.py") for src in srcs] # 代码生成规则,传递tags确保manual标签生效 native.genrule( name = genrule_name, srcs = srcs + [f"{dep}_proto" for dep in deps], outs = proto_out_files, cmd = "$(location @com_google_protobuf//:protoc) --python_out=$(GENDIR) $(SRCS)", tools = ["@com_google_protobuf//:protoc"], tags = tags, visibility = visibility, ) # 创建Python库目标 native.py_library( name = name, srcs = proto_out_files, deps = PROTO_PYTHON_DEPS + deps, tags = tags, visibility = visibility, **kwargs )
使用时直接替换官方的py_proto_library即可:
- 通配构建
bazel build //...会跳过所有带manual标签的目标 - 单独构建指定目标(如
bazel build //my/pkg:my_proto)时,会正常执行代码生成和构建
方案二:全局配置自动排除manual标签
若不想修改BUILD文件,可在项目根目录的.bazelrc中添加全局构建配置:
build --auto_exclude_tags=manual
该配置会让默认构建自动排除所有带manual标签的目标。需要单独构建时,直接指定目标即可,或临时覆盖配置:
bazel build //my/pkg:my_proto --include_tags=manual
注意:此方案为全局生效,会影响所有带manual标签的目标,适合项目统一需求场景。
内容的提问来源于stack exchange,提问作者Ted Pudlik
相关产品推荐
相关产品推荐

