有没有办法一次构建多个基于 Go 模块的项目?



在使用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 buildgo testgo listgo get命令仅适用于该工作区中的包。

在一个模块中,可以构建其他模块提供的包。例如,如果有一个路径为 example.com/foo 的模块,并且需要模块example.com/bar ,则可以go build example.com/bar/some/pkg 。但是,这不会使用您的本地副本 example.com/bar ;它会将该模块下载到您的模块缓存($GOPATH/pkg/mod(中,并从那里构建。

您可以通过 replace 指令使用另一个模块的本地副本。这有利于短期分支和相关模块的共同开发(通常在同一存储库中(。但是,replace指令仅适用于编写它们的模块。如果另一个模块需要您的模块,则忽略您的replace指令。

所有这些的目标是使构建可重现。使用模块的开发人员只能下载特定版本的依赖项。

最新更新