如何修复Bazel集成kafka-go时的文件冲突构建错误?
修复Bazel集成kafka-go时的snappy文件冲突问题
问题原因
kafka-go的compress/snappy目录下包含了两个同名的snappy.go文件,分别对应不同的snappy压缩实现(原生go-snappy和xerial-snappy)。当Bazel默认扫描所有.go文件编译时,会将两个文件都纳入构建,导致符号重复定义错误。
解决方案
方案1:在kafka-go的BUILD文件中排除重复文件
修改你的kafka-go.BUILD.bazel文件,在go_library规则的srcs中通过exclude过滤掉其中一个冲突的文件:
go_library( name = "kafka-go", srcs = glob( ["**/*.go"], # 根据需求排除其中一个实现文件 exclude = ["compress/snappy/go-xerial-snappy/snappy.go"], # 若需要使用xerial实现则改为: # exclude = ["compress/snappy/snappy.go"], ), importpath = "github.com/segmentio/kafka-go", visibility = ["//visibility:public"], deps = [ # 保持原有的依赖配置 ], )
方案2:通过编译标签指定snappy实现
kafka-go支持通过编译标签选择snappy实现,在WORKSPACE文件的kafka-go依赖配置中添加build_tags参数,指定要使用的实现:
go_repository( name = "com_github_segmentio_kafka_go", importpath = "github.com/segmentio/kafka-go", commit = "你的kafka-go版本commit哈希", # 使用原生snappy实现 build_tags = ["snappy"], # 若需要xerial实现则改为: # build_tags = ["xerial"], )
方案3:检查并清理重复依赖
确认WORKSPACE文件中没有重复引入kafka-go或snappy相关的第三方库,避免因依赖重复导致文件冲突。
内容的提问来源于stack exchange,提问作者srilakshmikanthanp
相关产品推荐
相关产品推荐

