【发布时间】:2020-06-15 20:48:36
【问题描述】:
在 go mod 中声明依赖版本的经典方法是通过
require (
k8s.io/api v0.17.4
k8s.io/apimachinery v0.17.4
k8s.io/cli-runtime v0.17.0
k8s.io/client-go v0.17.4
)
在过去(go
不过,我也 seen 将此技术用于 pin 版本:
require (
k8s.io/api v0.17.4
k8s.io/apimachinery v0.17.4
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
k8s.io/code-generator v0.18.0
k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a
)
replace (
k8s.io/api => k8s.io/api v0.16.4
k8s.io/client-go => k8s.io/client-go v0.16.4
k8s.io/code-generator => k8s.io/code-generator v0.16.4
k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf
)
问题是为什么有人会选择一种方法而不是另一种方法?后者是否需要解决来自传递依赖的冲突版本?如果是这样,为什么不应该从一开始就将版本只添加到replace() 子句中(不仅仅是在冲突的情况下)?
【问题讨论】:
-
"在过去 (go
-
例如,我们一般使用
replace,直到上游得到我们的补丁。通过替换,我们使用我们的固定版本而不进行任何代码更改,当上游更新时,我们提升版本并删除replace。这是一种根据需要覆盖版本的解决方案。希望这个解释能阐明其目的。 -
我理解这用于替换存储库或自定义分叉。并且可能覆盖 gomod 决定放入
require()的版本(它也更新了该部分,因此它是一个“共享”文本部分(有点不幸)。但是总是使用 是一个好习惯 需要确保使用用户选择的版本?
标签: go go-modules