Golang中如何在不更新到最新版本的情况下使用go mod vendor
Golang中如何在不更新到最新版本的情况下使用go mod vendor
我在尝试弄清楚是否可以在不更新go.mod文件的情况下运行go mod vendor命令。
我特意使用go get package/subpackage@commit并提交了包含正确版本的go.mod文件。
然后我运行go mod vendor,但它自动更新了我刚刚特意设置的软件包版本。
我已经查看了这个页面但没有找到解决方案:https://github.com/golang/go/wiki/Modules#how-do-i-use-vendoring-with-modules-is-vendoring-going-away
我需要使用vendor,因为我运行一个脚本来编辑一些vendored依赖项,我正在考虑以下构建流程:
GO111MODULE=on go get package/subpackge@commit
GO111MODULE=on go mod vendor
./Script/patch_vendors.sh --write
GO111MODULE=off go build
我的另一个选择是修改go mod vendor下载到的任何位置的复制源代码,但不确定如何处理。
go版本
go version go1.12 darwin/amd64
go环境
GOARCH="amd64"
GOBIN="/Users/tristian/go/bin"
GOCACHE="/Users/tristian/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/tristian/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.12/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.12/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/g1/v3hz1sm92nv7wbzpg3dx_h_h0000gp/T/go-build458969483=/tmp/go-build -gno-record-gcc-switches -fno-common"
提前感谢
更多关于Golang中如何在不更新到最新版本的情况下使用go mod vendor的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang中如何在不更新到最新版本的情况下使用go mod vendor的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go 1.12中,go mod vendor命令默认会同步go.mod文件中的依赖版本到vendor目录。如果你希望在不更新go.mod的情况下使用vendor,可以通过以下方式实现:
解决方案
使用-mod=readonly标志可以防止自动更新go.mod文件:
GO111MODULE=on go mod vendor -mod=readonly
或者更完整的构建流程:
GO111MODULE=on go get package/subpackage@commit
GO111MODULE=on go mod vendor -mod=readonly
./Script/patch_vendors.sh --write
GO111MODULE=off go build
替代方案
如果上述方法在你的Go 1.12版本中不可用,可以使用以下方法:
# 设置GOPROXY为direct,避免代理缓存问题
GOPROXY=direct GO111MODULE=on go get package/subpackage@commit
# 使用-tidy确保依赖一致但不更新版本
GO111MODULE=on go mod tidy
# 然后运行vendor
GO111MODULE=on go mod vendor
验证版本
在运行vendor之前,可以验证go.mod中的版本是否正确:
// go.mod 示例
module example.com/myproject
go 1.12
require (
package/subpackage v0.0.0-20190315175316-d3e4f1a8a3b4
)
replace package/subpackage => ./vendor/package/subpackage
完整示例
# 设置特定版本
GO111MODULE=on go get package/subpackage@d3e4f1a8a3b4
# 检查go.mod中的版本
cat go.mod | grep package/subpackage
# 使用readonly模式vendor
GO111MODULE=on go mod vendor -mod=readonly
# 应用补丁
./Script/patch_vendors.sh --write
# 构建
GO111MODULE=off go build
在Go 1.14及更高版本中,-mod=readonly行为更加稳定,但Go 1.12中这个标志应该能帮助防止意外的模块更新。

