在 GitHub 上,经常看到不少项目的 readme 里都有这么一句:
? GO111MODULE=on go get golang.org/x/tools/gopls@latest
2009 年,Go 被官方发布的时候,没有自带包管理功能。go get
命令会根据import
路径,把所有源码下载到$GOPATH/src
目录下。这导致,我们无法对依赖包进行版本控制,只有master分支能代表一个包的稳定版本。
Go 1.11 版本中,引入了Go Modules
(即,Go 模块),可以通过go.mod
文件存储依赖包的版本号。
从那时起,GOPATH模式
和Go模块模式
之间的交互就成为了Go最大的陷阱之一。
要想避开这些陷阱,离不开一个环境变量——GO111MODULE
。
简单来讲,GO111MODULE=on
开启Go模块模式
,允许用户在go get
时指定依赖包的版本。
? GO111MODULE=off go get golang.org/x/tools/gopls@v0.1.8
go: cannot use path@version syntax in GOPATH mode
# 报错:GOPATH模式无法指定版本
这里要小心踩坑。默认情况下,如果当前目录下有go.mod
文件,go get
命令会把你刚刚安装的依赖包更新到go.mod
。
在 安装一些开发工具(比如gopls, kind)时,如果你不想更新go.mod
文件,可以使用cd && go get
命令避免污染 go.mod
。
# 更详细的解释,可见官方文档
? go help get
? go help install
比如 在使用@latest
时,你只想要更新当前包到最新tag。加上-u
选项后,go会把这个包的所有依赖包也更新。如果依赖包里有breaking changes,那就坑惨了。
# 只更新 protos-go
? go get git.bala.com/hahaha/protos-go@latest
go: git.bala.com/hahaha/protos-go latest => v0.0.6
# 依赖包也全都更新
? go get -u git.bala.com/hahaha/protos-go@latest
go: git.bala.com/hahaha/protos-go latest => v0.0.6
go: github.com/golang/protobuf upgrade => v1.4.2
go: google.golang.org/protobuf upgrade => v1.23.0
再比如,如果使用@v0.1
加上-u
选项,go get
会获取1.0标签
下最新的版本。
有时候,我们import了一个依赖包,但是需要修改其中的代码,怎么办呢?
go.mod
文件最后加上replace
。# 替换成本地路径
replace github.com/maelvls/beers => ../beers
# 替换成 github 路径
replace github.com/facebookincubator/ent v0.0.1 => github.com/mine/ent v0.0.1
使用 go mod vendor
+ go build -mod=vendor
命令,这会强制go
使用vendor/
路径下的文件,而不是$GOPATH/pkg/mod
下的。
这俩命令,也可以帮助你的 vim 和 VSCode 解决找不到 某个指定版本的包的问题,毕竟现在所有的依赖包都在 /vendor
目录下了。
大家在公司一般使用 Gitlab/Github 上的私有代码库。Go 1.13之后,使用GOPRIVATE
变量,我们可以跳过包代理,更快捷地获取私有库代码。
# 也可以在 .gitconfig 文件中加上相应配置
git config --global url."https://foo:${GITHUB_TOKEN}@github.com/company".insteadOf "https://github.com/company"
export GOPRIVATE=github.com/company/\*
原文:https://www.cnblogs.com/wwwn/p/12968706.html