如何修复Bazel构建出现的missing strict dependencies错误
问题根因
报错来自全量构建时编译leeroy-web-img目标的严格依赖检查,和单目标构建的go_binary目标无关:
- 运行
bazel build //leeroy-web时,仅触发同名go_binary目标构建,该目标通过embed引用了配置了完整依赖的leeroy-web_lib库,依赖链完整因此构建成功。 - 运行
bazel build //...时,会遍历编译所有目录下的所有Bazel目标,包括定义的go_image目标leeroy-web-img。当前该目标直接通过srcs字段引入web.go源码,但没有声明代码中导入的//leeroy-web/handlers、//sum-pkg两个依赖,直接触发Go规则的严格依赖校验,抛出missing strict dependencies错误。
修复方法
不要在go_image中重复配置源码和导入路径,直接复用已经配置好依赖的go_library,和go_binary的配置逻辑保持一致,避免重复维护依赖导致漏配。
将leeroy-web/BUILD中的go_image规则替换为如下内容:
go_image( name = "leeroy-web-img", embed = [":leeroy-web_lib"], goarch = "amd64", goos = "linux", static = "on", )
修改完成后先执行bazel clean清理旧构建缓存,再执行bazel build //...即可完成全量构建。
注:
go_image规则本身和go_binary逻辑一致,只要直接传入srcs就必须手动在deps中声明所有源码导入的依赖包,重复配置极易出现漏配。通过embed引用同目录下统一维护的go_library是rules_go官方推荐的标准写法,能从根源避免这类依赖不一致问题。
内容的提问来源于stack exchange,提问作者reactor
相关产品推荐
相关产品推荐

