【发布时间】: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 one 或 this 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