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

时间:2019-08-06 23:30:37

标签: go go-modules

在使用Go模块之前,我可以使用GOPATH来编译go build ./...中的所有内容。

如果我在具有多个基于模块的Go项目的目录的根目录中尝试此操作,则它不会下载go.mod中指定的依赖项,并且由于找到它们而无法找到代码所依赖的包在GOPATH中。

我有126个基于模块的项目,我宁愿不必编写脚本来处理它们。

1 个答案:

答案 0 :(得分:1)

否,没有办法仅使用go命令来执行此操作。编写脚本或使用replace指令是方法。一个简单的脚本可能是:

find "$(go env GOPATH)/src" \
  -name vendor -prune -o \
  -name go.mod -exec bash -c 'cd "$(dirname {})" && go build ./...' \;

每个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 directive使用其他模块的本地副本。这对于短期派生和相关模块的共同开发(通常在同一存储库中)非常有用。但是,replace伪指令仅适用于编写它们的模块。如果另一个模块需要您的模块,那么您的replace指令将被忽略。

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