我想在模块存储库中更新单个依赖项。
我仔细阅读了许多文档和JustForFunc视频,看来这样做的方法是进入.mod文件并将其从“ 1.0.0”更新为“ 1.2.0”并运行go build。
这有效,但是随后我看到我的整个go.mod文件在很多地方都发生了变化,包括那些不是间接的。其中一些更改的版本是我项目中其他地方使用的依赖项的主要版本更改。我明显的担心是,当我希望这些版本保持不变时,这将导致重大变化。
我正在使用模块并在我的GOPATH之外工作。
有没有一种方法可以最小化我的.mod文件更改?
答案 0 :(得分:3)
tl; dr将-mod=readonly
传递给go
命令以防止其自动将依赖关系更新为最新的次要版本/补丁版本。
要升级或降级到更特定的版本,“ go get”允许通过在软件包参数中添加@version后缀或“模块查询”来覆盖版本选择,例如go get github.com/gorilla/mux @ v1.6.2,请获取foo @ e3702bed2,或获取foo @'
go工具提供了相当多的灵活性来调整或禁用这些默认行为,包括通过-mod = readonly,-mod = vendor,GOFLAGS,GOPROXY = off,GOPROXY = file:/// filesystem / path,go mod供应商,然后下载mod。
有关这些选项的详细信息遍布整个官方文档。 here是一个社区,试图对与这些行为相关的旋钮进行综合概述,其中包括指向官方文档的链接,以获取更多信息。
答案 1 :(得分:1)
go
命令更新 go.mod
文件以确保一致性。如果您 go get example.com/m@v1.2.0
并且它更改了 go.mod
文件中的许多其他要求,则意味着 example.com/m v1.2.0
传递性地依赖于高于您指定的那些其他模块的版本。
您可以使用 go mod graph
和 digraph
工具查看这些传递性需求是如何产生的。
当您需要更新单个依赖项时,您可以采取一些步骤来避免意外更改(尤其是破坏性更改):
定期升级您的依赖项(来自模块根目录的 go get -u ./...
)以保持每个依赖项的最新版本,并在每次升级后重新运行您的测试。如果这带来了重大变化,您可以暂时取消升级 - 但随后您就会知道它即将到来并有足够的时间来计划解决它。 (不要让计划外的技术债务长期累积。)
在添加依赖项之前,请查看其发布历史记录和问题跟踪器以了解其中断的频率:这将帮助您估计保持最新版本所需的工作那种依赖。 (避免承担造成过多破坏性更改的依赖项。)
如果您需要保留该依赖项的特定版本,请在升级时将该版本显式传递给 go get
。从 Go 1.16 开始,go get -u
将避免升级在命令行中指定版本的模块;如果这些版本不兼容,它会给出一个错误,指出哪个(两个或更多)命名版本是相互不兼容的。