You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:21:13