在使用Go模块之前,我可以使用go build ./...
编译GOPATH
中的所有内容。
如果我在具有多个基于模块的 Go 项目的目录的根目录中尝试此操作,它不会下载 go.mod
中指定的依赖项,并且无法找到代码所依赖的包,因为它正在GOPATH
中查找它们。
我有 126 个基于模块的项目,我宁愿不必编写脚本来处理构建它们。
不,没有办法仅使用 go 命令来做到这一点。编写脚本或使用replace
指令是要走的路。一个简单的脚本可能是:
find "$(go env GOPATH)/src"
-name vendor -prune -o
-name go.mod -exec go build -C {} ./... ;
每个 go.mod 文件定义一个工作区,go build
、go test
、go list
、go get
命令仅适用于该工作区中的包。
在一个模块中,可以构建其他模块提供的包。例如,如果有一个路径为 example.com/foo
的模块,并且需要模块example.com/bar
,则可以go build example.com/bar/some/pkg
。但是,这不会使用您的本地副本 example.com/bar
;它会将该模块下载到您的模块缓存($GOPATH/pkg/mod
(中,并从那里构建。
您可以通过 replace
指令使用另一个模块的本地副本。这有利于短期分支和相关模块的共同开发(通常在同一存储库中(。但是,replace
指令仅适用于编写它们的模块。如果另一个模块需要您的模块,则忽略您的replace
指令。
所有这些的目标是使构建可重现。使用模块的开发人员只能下载特定版本的依赖项。