如何防止 go get 更新 go.mod 文件

How to prevent go get from updating go.mod file

TL;DR: Is there any way I can forcefully prevent go get from altering the go.mod file?

当我对某些包执行 go get 时,例如:

$ go get github.com/AsynkronIT/protoactor-go/protobuf/protoc-gen-gograin

它将打印出它有更新的依赖项(在我的 go.mod 文件中定义):

go get: upgraded github.com/AsynkronIT/protoactor-go v0.0.0-20200815184336-b225d28383f2 => v0.0.0-20210405044454-10bc19881ad6
# (...) Note, this happens for other packages, not just `AsynkronIT/protoactor-go`.

这会导致 go.mod 文件在 CI 构建期间发生变化,并影响后续的构建阶段,在构建某些东西时,它将尝试使用依赖项的更新版本,这可能会引入重大更改,而不是最初在 go.mod 文件中定义的版本。

我试过使用 -mod=readonly 或确保未使用 -u 标志,但它仍会更新 go.mod 文件,例如:

$ GOFLAGS=-mod=readonly go get github.com/AsynkronIT/protoactor-go/protobuf/protoc-gen-gograin

go get: upgraded github.com/AsynkronIT/protoactor-go v0.0.0-20200815184336-b225d28383f2 => v0.0.0-20210405044454-10bc19881ad6
# (...)

我也尝试寻找类似的问题,例如 this one, or this other one,但还没有找到替代方法来防止 go get 命令改变 go.mod

我用来阻止此行为的当前解决方法是在某些 go get … 步骤后立即执行 git checkout -- go.mod 以重置 go get 所做的任何更改,从而避免某些依赖项更新版本的重大更改。

我使用的是 go 版本 1.16.3

对于 Go 1.16 及之后的版本,您可以使用 go install 安装二进制文件而不影响 go.mod

go install github.com/AsynkronIT/protoactor-go/protobuf/protoc-gen-gograin