在主要依赖项更新后更新go模块导入引用

时间:2019-03-11 07:19:23

标签: go

场景:我需要在存储库中将第三方Go模块更新为新的主要版本。

示例:从github.com/google/go-github/v24go.mod

更新go.sumimport之后,如何以编程方式更新存储库中的所有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/v2github.com/abc/def-core的情况下进行更新,因为例如可能还会有一个名为{{1}}的模块。

请注意,此问题无意也捕获“您可能有重大更改并需要更新代码” yada yada -这是一个单独的主题,在这里没有被问到。

2 个答案:

答案 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

从存储库中:

  

动机

     

有两个很好的用例:

     
      
  1. 如果您拥有一个图书馆并且想要引入重大更改,那么您就必须解决所有Go文件和子功能以及   更新导入路径以包括v2,v3等。此工具可以做到   自动使用一个命令。

  2.   
  3. 如果您拥有已被标记为v2或更高版本但与语义导入版本控制不兼容的库,则此工具可以解决   一个命令对您来说也是一个问题。介绍go.mod文件   使用正确的导入路径,只需运行一次mod upgrade或mod   -t = X升级(其中x是最新的主要标签),以更新go文件的导入路径以匹配您所处的任何标签。

  4.   

除了这两个用例外,该实用程序最近还增加了对客户端的支持,方法是通过更改客户端/vN代码中的*.go和客户的go.mod

换句话说,如果您是从v2v3的模块的作者,则可以使用此实用程序;如果您是从v2v3的模块的使用者,也可以使用此实用程序。 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)

由于新的主要版本表示破坏兼容性,因此无论如何您都必须手动修复代码:如果要使用新的主要版本,则更新导入路径是您最不希望自动化的问题。