在使用Go模块之前,我可以使用GOPATH
来编译go build ./...
中的所有内容。
如果我在具有多个基于模块的Go项目的目录的根目录中尝试此操作,则它不会下载go.mod
中指定的依赖项,并且由于找到它们而无法找到代码所依赖的包在GOPATH
中。
我有126个基于模块的项目,我宁愿不必编写脚本来处理它们。
答案 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 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
directive使用其他模块的本地副本。这对于短期派生和相关模块的共同开发(通常在同一存储库中)非常有用。但是,replace
伪指令仅适用于编写它们的模块。如果另一个模块需要您的模块,那么您的replace
指令将被忽略。
所有这些的目标是使构建可复制。使用您的模块的开发人员将只能下载特定版本的依赖项。