cmd/go: add option to prevent 'go get -u' from updating certain dependencies

tp5buhyn  于 6个月前  发布在  Go
关注(0)|答案(9)|浏览(57)

我们应该为用户提供一种方法,防止 go get -u 更新某些依赖项,除非它们被明确请求。
用户可能需要将模块依赖项固定到较低版本的几个原因。例如:

  1. 依赖项具有破坏性更改,这是允许在 v0 版本中发生的。
  2. 存在涉及主模块的循环依赖关系,必须小心处理以保持特定版本的循环。这在其中一个模块是另一个的前缀时尤其重要,因为我们希望避免在包之间移动时出现模糊的导入。
  3. 依赖项添加了许多不需要的额外传递依赖项,这些依赖项可能需要下载。
  4. 依赖项具有新功能,但未使用,并增加了显著的开销。
    当用户有一个需要特别注意更新的依赖项时, go get -u 单独使用是不安全的。相反,需要构建一个包含所有需求的列表,排除不应该更新的模块,然后将该列表传递给 go get -u 。这很繁琐。
    一些改进的想法:
  • 一个 -except-exclude 标志,允许用户指定不应更新的模块。
  • go.mod 中的注解或注解,告诉 go get -u 除非在命令行上明确命名,否则不要更新模块。

这与 #28424 有一定的关联。

ugmeyewa

ugmeyewa1#

go.mod文件中的exclude指令让我们部分实现了目标:如果出现了一些回归问题,例如大量的新依赖项或显著的性能下降,那么维护者应该修复这些回归并发布一个新版本,或者用户应该分叉该模块以移除不必要的膨胀。无论如何,需要暂停的时间都只应该是一两个版本。

unguejic

unguejic2#

我们可能需要以其他方式解决循环依赖问题,例如让 go get -u 检测到循环并尝试升级过去( #27899 )。特别是,我们不能阻止给定模块的外部用户引入更新的需求,因此依赖于某个较旧版本似乎很脆弱。

qqrboqgw

qqrboqgw3#

最后,如果在 v0 版本中出现了破坏性的变化,那么最好还是提醒修复调用站点。(作为解决方法,你可以始终将特定模块的明确较旧版本传递给 go get -u ,并在更新命令中包含该明确信息是一个很好的指标,表明你的模块正面临着悬在头顶的达摩克利斯之剑兼容性问题...)

dl5txlt9

dl5txlt94#

我无法准确判断这些问题的严重程度或出现频率。正如你所指出的,对于所有这些问题,都有替代方案,但我不确定它们会经常出现,或者它们会有多烦人。
让我们将此标记为未计划,并在模块默认启用后决定如何处理。我认为在那之前,这不是一个关键功能。

k7fdbhmy

k7fdbhmy5#

我认为这个用例最适合的查询方式是特殊版本查询。upgrade 已经表示“当前选定的版本或更高”,而patch 表示“当前选定的版本或更高,但在同一次修订版中”;这些逻辑的后续步骤可能是某个第三标记(也许是current?),表示“当前选定的版本且没有更高的”。

jaxagkaj

jaxagkaj6#

这种可能性有多大?我现在处于一个场景中,我想更新我的go.mod中的所有依赖项,除了一个由于我们尚未准备好采用的破坏性更改。实际上,我希望将此依赖项固定在我们当前的版本上,同时仍然允许其他所有内容进行更新。我今天无法找到正确完成此操作的方法。

vptzau2j

vptzau2j7#

@braydonk,今天你可以将你想要保留的包或模块的版本作为显式参数传递给go get -u,例如:

go get -u ./... example.com/stuck@v0.5
vmdwslir

vmdwslir8#

啊,酷,当我在查看文档或甚至博客文章时,我无法在那里找到它。谢谢你的技巧!

rpppsulh

rpppsulh9#

我也非常希望看到这个功能。在我正在工作的代码库中,我们有3个特定的依赖项,它们引入了破坏性的更改,因此无法进行更新。我非常希望能够做类似 go get -pin example.com/foo@v0.5 的事情,即在 go.mod 中的相关行后添加一个 // pinned 注解,以便后续的 go get -u ./... 执行跳过固定模块。

相关问题