如何使用bazel build构建所有采用特定规则的目标?
可行方案汇总
方案1:维护集中式的汇总目标
在仓库根目录或者专门的构建配置目录(例如//build/proto)下定义一个统一的汇总目标(用alias或者filegroup规则均可),将所有分散在仓库各处的proto编译目标都作为它的依赖项。工程师仅需要执行bazel build //build/proto:all-proto即可完成全量编译。
后续新增proto编译目标时,仅需要更新这个汇总目标的依赖列表即可。如果不想手动维护,可以搭配bazel query写个轻量脚本自动生成依赖列表,也可以加CI校验确保新增的proto目标已经被纳入汇总。方案2:用bazel查询命令动态筛选目标,无需修改现有配置
如果不想调整现有目标命名也不想维护汇总列表,可以直接通过bazel的查询能力定位所有proto相关编译目标。
如果你们的proto编译目标用的是标准proto_library/grpc_xx_library规则,直接执行以下命令即可编译所有proto:
如果是团队自定义的proto编译规则,把引号内的规则名替换成你们自定义的规则名即可。可以把这条命令封装成仓库内置的脚本(例如bazel build $(bazel query 'kind("proto_library", //...)')./scripts/compile_all_protos.sh),工程师直接执行脚本即可,不需要记忆复杂命令。方案3:仅编译更新过的proto,提升执行效率
如果只需要编译拉取更新后有变更的proto,可以结合git变更检测和bazel查询,只编译关联的目标,命令示例:
该命令会自动筛选出和当前HEAD相比有变更的.proto文件关联的所有编译目标,比全量编译节省大量时间,同样可以封装到脚本中使用。bazel build $(bazel cquery 'kind("proto_library", rdeps(//..., set($(git diff --name-only HEAD | grep .proto))))')方案4:自动扫描全仓库proto目标
如果你使用的是官方的rules_proto、rules_grpc规则,可以在顶层BUILD文件中通过自定义宏或者genrule自动扫描全仓库下所有.proto文件对应的编译目标,不需要手动维护汇总列表,每次构建时自动完成扫描匹配。
注:你原本想到的统一目标命名的方案也可以搭配上面的方案共同使用,容错性更高。
内容的提问来源于stack exchange,提问作者Noel Yap
相关产品推荐
相关产品推荐

