场景:我需要跨存储库将第三方Go模块更新为新的主要版本。
示例:从github.com/google/go-github/v20到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'
这将捕获所有string实例,而不仅仅是import中的实例(尽管这不一定是件坏事)。但我担心可能是从github.com/abc/def更新到github.com/abc/dev/v2的情况,例如,可能还有一个名为github.com/abc/def-core的模块。
请注意,这个问题并不是要捕捉“你可能有破坏性的更改,需要更新你的代码”yada yada -这是一个单独的主题,这里不问。
发布于 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。
从存储库中:
动机
有两个很好的用例可以做到这一点:
除了这两个用例之外,该实用程序最近还添加了对自动升级客户端以使用模块的不同主要版本的支持,方法是更改客户端的*.go代码和客户端的go.mod中的/vN。
换句话说,如果您是从v2到v3的模块的作者,则可以使用该实用程序;如果您是从v2到v3的模块的使用者,则也可以使用该实用程序。
它使用诸如golang.org/x/tools/go/ast/astutil之类的包来操作*.go源代码的AST,以便更新导入路径,因此不应该受到您对使用sed所表达的担忧类型的影响。
发布于 2019-03-11 16:38:47
因为一个新的主版本会破坏兼容性,所以无论如何你都必须手动修复你的代码:在新的主版本出现的情况下更新导入路径是你最不关心的自动化问题。
https://stackoverflow.com/questions/55096868
复制相似问题