如何让gopls识别Bazel管理的Go项目中的GitHub外部依赖
解决Bazel管理Go项目的gopls依赖识别问题
不用逐个执行go install,有两种更高效的方式解决这个问题,同时保证版本和Bazel的WORKSPACE同步:
方式一:用Bazel导出依赖到vendor目录
Bazel可以直接把WORKSPACE中声明的所有依赖导出到项目的vendor目录,让gopls像识别普通Go模块一样读取依赖:
- 先运行命令生成依赖映射:
bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=repositories.bzl%go_repositories
- 接着生成vendor目录:
bazel run //:gazelle -- vendor
执行完这两步,所有WORKSPACE里的依赖都会被拉取到项目根目录的vendor下,gopls会自动识别这里的代码,不再提示找不到模块。
方式二:配置gopls直接适配Bazel
不用导出依赖,直接让gopls通过Bazel获取依赖信息:
- 在Coc的配置文件(比如
~/.config/nvim/coc-settings.json)里添加gopls的配置:
{ "gopls": { "buildFlags": ["-tags=bazel"], "env": { "GOPACKAGESDRIVER": "$(bazel info workspace)/tools/gopackagesdriver.sh" } } }
- 在项目根目录创建
tools/gopackagesdriver.sh脚本,写入以下内容:
#!/bin/bash exec bazel run //:gazelle -- packages "$@"
- 给脚本添加执行权限:
chmod +x tools/gopackagesdriver.sh
这样gopls会通过这个脚本调用Bazel来查询依赖,直接识别WORKSPACE里的包,完全不需要依赖GOPATH或GOROOT。
为什么不推荐逐个go install?
手动go install不仅繁琐,还会破坏版本一致性:WORKSPACE里的依赖版本是Bazel精确管控的,手动安装很可能拉取到不同版本,导致本地编译和Bazel构建结果不一致。另外,Bazel管理的依赖可能包含自定义补丁或修改,手动安装拿不到这些变更,进一步引发问题。
内容的提问来源于stack exchange,提问作者DutchBro
相关产品推荐
相关产品推荐

