场景:我需要在存储库中将第三方Go模块更新为新的主要版本。
示例:从github.com/google/go-github/v24
到go.mod
更新go.sum
和import
之后,如何以编程方式更新存储库中的所有find *.go -type f -print0 | xargs -0 sed -i '' 's/"github.com\/google\/go-github\/v20/"github.com\/google\/go-github\/v24/g'
语句以使其匹配?
这是一种不简单的方法:
import
这将捕获所有字符串实例,而不仅仅是github.com/abc/def
中的字符串实例(尽管这不一定是一件坏事)。但是我担心在从github.com/abc/dev/v2
到github.com/abc/def-core
的情况下进行更新,因为例如可能还会有一个名为{{1}}的模块。
请注意,此问题无意也捕获“您可能有重大更改并需要更新代码” yada yada -这是一个单独的主题,在这里没有被问到。
答案 0 :(得分:0)
https://github.com/marwan-at-work/mod是一个很好的自动化解决方案,它可以在您的/vN
代码和*.go
中自动添加,删除或更改所需的go.mod
。
使用您的示例,它应该能够将代码从使用github.com/google/go-github/v20
改为使用github.com/google/go-github/v24
。
从存储库中:
动机
有两个很好的用例:
如果您拥有一个图书馆并且想要引入重大更改,那么您就必须解决所有Go文件和子功能以及 更新导入路径以包括v2,v3等。此工具可以做到 自动使用一个命令。
如果您拥有已被标记为v2或更高版本但与语义导入版本控制不兼容的库,则此工具可以解决 一个命令对您来说也是一个问题。介绍go.mod文件 使用正确的导入路径,只需运行一次mod upgrade或mod -t = X升级(其中x是最新的主要标签),以更新go文件的导入路径以匹配您所处的任何标签。
除了这两个用例外,该实用程序最近还增加了对客户端的支持,方法是通过更改客户端/vN
代码中的*.go
和客户的go.mod
。
换句话说,如果您是从v2
到v3
的模块的作者,则可以使用此实用程序;如果您是从v2
到v3
的模块的使用者,也可以使用此实用程序。 golang.org/x/tools/go/ast/astutil
至*.go
。
它使用诸如sed
之类的软件包来操纵var LoadDuration = "00:00:03:234222";
var f = @"hh\:mm\:ss\:FFFFFFF";
var a= TimeSpan.ParseExact(LoadDuration, f, CultureInfo.InvariantCulture);
源的AST以便更新导入路径,因此不应受到您对使用{{1}表示的关注类型的影响}。
答案 1 :(得分:-1)
由于新的主要版本表示破坏兼容性,因此无论如何您都必须手动修复代码:如果要使用新的主要版本,则更新导入路径是您最不希望自动化的问题。