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

主要依赖项更新后更新go模块导入引用,go,Go,场景:我需要跨存储库将第三方Go模块更新为新的主要版本 示例:github.com/google/go-github/v20togithub.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

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

示例:
github.com/google/go-github/v20
to
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
的模块


请注意,这个问题并不是为了捕捉“您可能有不稳定的更改,需要更新您的代码”yada yada-这是一个单独的主题,在这里没有被问到。

因为新的主要版本表明破坏了兼容性,所以您必须手动修复代码:在出现新的主要版本的情况下更新导入路径是您最不需要自动化的问题

一个好的自动化解决方案是,它可以自动添加、删除或更改
*.go
代码和
go.mod
中所需的
/vN

使用您的示例,它应该能够将您的代码从使用
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文件的导入路径,以匹配您所处的任何标记

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

    换句话说,如果您是从
    v2
    v3
    的模块的作者,则可以使用此实用程序,如果您是从
    v2
    v3
    的模块的消费者,也可以使用此实用程序


    它使用诸如
    golang.org/x/tools/go/ast/astutil
    之类的包来操作
    *.go
    源代码的ast,以更新导入路径,因此不应受到您对使用
    sed
    表达的担忧类型的影响。没有人说会直接提交此代码。查找和更新可能发生更改的文件是非常好的第一步。你在这里投的反对票和不回答票正是他们在这里描述的: