Bazel 0.11.1构建含内部依赖项目时失败原因排查
解决Bazel编译Go项目缺失直接依赖的问题
我来帮你搞定这个编译报错的问题,结合你用的MacOS 10.13.2、Go 1.10和Bazel 0.11.1环境,给你几个实用的排查和解决步骤:
1. 先检查Gazelle生成的BUILD文件是否正确关联内部依赖
首先得确认几个关键BUILD文件的内容是否到位:
- project1/dep1/BUILD:应该有一个
go_library规则,并且设置了正确的可见性,比如:
go_library( name = "dep1", srcs = ["dep1.go"], importpath = "github.com/BazelBuildForGo/project1/dep1", visibility = ["//visibility:public"], )
- project1/p1lib/BUILD:必须明确依赖dep1的库,规则里的
deps字段要加上//project1/dep1,比如:
go_library( name = "p1lib", srcs = ["p1lib.go"], importpath = "github.com/BazelBuildForGo/project1/p1lib", deps = ["//project1/dep1"], visibility = ["//visibility:public"], )
- project1/BUILD:主项目的
go_binary规则得依赖p1lib,也就是deps里要有//project1/p1lib:
go_binary( name = "project1", srcs = ["main.go"], deps = ["//project1/p1lib"], )
如果Gazelle生成的文件里缺了这些依赖项,那肯定会报缺失直接依赖的错误。
2. 重新运行Gazelle并覆盖所有子包
你之前只运行了gazelle -go_prefix=github.com/BazelBuildForGo,可能没遍历到所有子目录。试试在仓库根目录执行这个命令,让Gazelle扫描所有子包并更新BUILD文件:
gazelle -go_prefix=github.com/BazelBuildForGo ./...
这个命令会确保内部包之间的依赖关系被正确识别和写入BUILD文件。
3. 检查Go代码里的import路径是否匹配go_prefix
Bazel的Go规则对import路径要求很严格,p1lib里导入dep1的路径必须是完整的github.com/BazelBuildForGo/project1/dep1,不能用相对路径(比如./dep1)。如果代码里用了相对导入,先改成完整路径,再重新运行Gazelle生成BUILD文件。
4. 清理Bazel缓存后重试
有时候旧缓存会导致一些奇怪的依赖问题,先清理缓存再编译试试:
bazel clean bazel build //project1
5. 确认Gazelle和Bazel版本兼容
你用的Bazel 0.11.1是比较老的版本,对应的Gazelle版本也得匹配(当时Gazelle大概是0.10.x系列)。如果你的Gazelle版本太新,可能会和旧版Bazel不兼容。可以安装匹配版本的Gazelle:
go get github.com/bazelbuild/bazel-gazelle/cmd/gazelle@v0.10.0
安装完后重新生成BUILD文件再编译。
内容的提问来源于stack exchange,提问作者AlexS
相关产品推荐
相关产品推荐

