【问题标题】:How to prevent go get from updating go.mod file如何防止 go get 更新 go.mod 文件
【发布时间】:2021-04-19 10:53:20
【问题描述】:

TL;DR:有什么办法可以强制阻止go get 更改go.mod 文件?

当我对某些包进行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 onethis other one,但还没有找到阻止 go get 命令更改 go.mod 的替代方法。

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

我正在使用 go 版本1.16.3

【问题讨论】:

  • 您是否考虑/尝试过使用带有版本后缀的go install"go install 现在接受带有版本后缀的参数(例如,go install example.com/cmd@v1.0.0)。这会导致 go install 以模块感知模式构建和安装包,忽略 go.mod 文件在当前目录或任何父目录中,如果有的话。这对于在不影响主模块依赖关系的情况下安装可执行文件很有用。" 1.16 Realse Notes.
  • go get 存在的理由是修改 go.mod。
  • 您能否描述一下为什么要获取该特定包,而不是将其存储为项目的依赖项?
  • @Volker,如果我的问题是正确的,那么 OP 会询问为什么 go get 正在更新依赖项的版本。从表面上看,OP 对为什么不尝试将依赖项保留在当前版本而感到困惑——如果 MVS 允许,我想。

标签: go go-modules go-get


【解决方案1】:

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

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

【讨论】:

  • 注意,需要@latest 或类似的东西才能工作
猜你喜欢
  • 2019-07-07
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多