首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在主要依赖项更新后更新go模块导入引用

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

Stack Overflow用户
提问于 2019-03-11 15:19:23
回答 2查看 1.3K关注 0票数 3

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

示例:从github.com/google/go-github/v20github.com/google/go-github/v24

在更新go.modgo.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'

这将捕获所有string实例,而不仅仅是import中的实例(尽管这不一定是件坏事)。但我担心可能是从github.com/abc/def更新到github.com/abc/dev/v2的情况,例如,可能还有一个名为github.com/abc/def-core的模块。

请注意,这个问题并不是要捕捉“你可能有破坏性的更改,需要更新你的代码”yada yada -这是一个单独的主题,这里不问。

EN

回答 2

Stack Overflow用户

发布于 2019-03-16 04:01:08

一个很好的自动化解决方案是https://github.com/marwan-at-work/mod,它可以在*.go代码和go.mod中自动添加、删除或更改所需的/vN

使用您的示例,它应该能够将您的代码从使用github.com/google/go-github/v20更新为使用github.com/google/go-github/v24

从存储库中:

动机

有两个很好的用例可以做到这一点:

  1. 如果你拥有一个库,并且你想引入一个突破性的变化,那么你必须绕过你所有的go文件和子包,并更新导入路径,以包括v2,v3等。这个工具只需要一个命令就可以自动完成。
  2. 如果你拥有一个已经标记为v2或更高版本的库,但是与语义导入版本控制不兼容,那么这个工具也可以用一个命令为你解决这个问题。引入一个具有正确导入路径的go.mod文件,只需运行一次mod upgrade或mod -t=X upgrade (其中x是最新的主要标签)即可更新go文件的导入路径,以匹配您所在的任何标签。

除了这两个用例之外,该实用程序最近还添加了对自动升级客户端以使用模块的不同主要版本的支持,方法是更改客户端的*.go代码和客户端的go.mod中的/vN

换句话说,如果您是从v2v3的模块的作者,则可以使用该实用程序;如果您是从v2v3的模块的使用者,则也可以使用该实用程序。

它使用诸如golang.org/x/tools/go/ast/astutil之类的包来操作*.go源代码的AST,以便更新导入路径,因此不应该受到您对使用sed所表达的担忧类型的影响。

票数 1
EN

Stack Overflow用户

发布于 2019-03-11 16:38:47

因为一个新的主版本会破坏兼容性,所以无论如何你都必须手动修复你的代码:在新的主版本出现的情况下更新导入路径是你最不关心的自动化问题。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55096868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档