Bazel跨包引用proto文件实现textproto编码规则报错求助
解决Bazel自定义encode_textproto规则跨包引用Proto的路径错误
问题本质
你遇到的错误是因为自定义规则里手动处理proto文件路径时,没正确解析跨包Label对应的实际文件位置,而且filegroup是多文件集合,不符合规则要求单个文件的限制。
分步解决方案
1. 修改自定义规则实现,让Bazel自动处理文件路径
调整encode_textproto规则的实现,不要自己拼接路径,直接通过Bazel的API获取依赖文件的正确路径:
def _encode_textproto_impl(ctx): textproto = ctx.file.src proto_file = ctx.file.proto output = ctx.actions.declare_file(ctx.attr.name + ".binproto") # 用protoc命令时,直接取proto文件的目录作为--proto_path ctx.actions.run_shell( inputs = [textproto, proto_file], outputs = [output], command = """ protoc --proto_path=$(dirname "{proto_file}") \ --encode={msg_type} "{proto_file}" \ < "{textproto_file}" > "{output_file}" """.format( proto_file = proto_file.path, msg_type = ctx.attr.message_type, textproto_file = textproto.path, output_file = output.path, ), ) return [DefaultInfo(files = depset([output]))] encode_textproto = rule( implementation = _encode_textproto_impl, attrs = { "src": attr.label(mandatory = True, allow_single_file = [".textproto"]), # 这里设置允许单个proto文件的Label引用 "proto": attr.label(mandatory = True, allow_single_file = [".proto"]), "message_type": attr.string(mandatory = True), }, )
2. 在data包的BUILD文件中直接引用proto文件
不需要用filegroup,直接把跨包的proto文件Label传给规则:
# foo/bar/data/BUILD encode_textproto( name = "converted_data", src = "your_data.textproto", # 直接引用proto包中的单个文件 proto = "//foo/bar/proto:message.proto", message_type = "foo.bar.YourMessageType", )
3. 确认proto文件的包声明正确
确保//foo/bar/proto/message.proto里的包名和你在message_type中用的一致:
syntax = "proto3"; package foo.bar; message YourMessageType { // 字段定义 }
为什么这能解决问题
- 规则的
proto属性设置allow_single_file = [".proto"]后,Bazel会自动解析跨包Label对应的文件,不需要你手动处理路径转换。 - 用
proto_file.path获取的是文件在Bazel工作区中的绝对路径,dirname能准确提取proto所在目录,让protoc正确找到消息定义。
内容的提问来源于stack exchange,提问作者user2759391
相关产品推荐
相关产品推荐

