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

1 回复

更多关于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中这个标志应该能帮助防止意外的模块更新。

回到顶部