1

这是特定于:https ://github.com/twitchtv/twirp

该库当前版本为 v7,我们希望将其迁移到 go 模块中。该库当前是从其他库导入的,如下所示:

// go.mod
require github.com/twitchtv/twirp v7.2.0+incompatible

// .go code
import "github.com/twitchtv/twirp"

如果我们go.mod在库中添加一个文件,现在每个其他库都被迫更改导入路径,如下所示:

// go.mod
require github.com/twitchtv/twirp v7.2.0

// .go code
import "github.com/twitchtv/twirp/v7"

我们如何迁移 Twirp 库以使用 go 模块而不强制其他库更新其导入路径?

这里的主要问题是单个服务可能会导入在不同版本上生成的多个 Twirp 客户端,并使用依赖于特定类型的辅助函数。强制导入路径更新将强制所有这些辅助函数需要管理旧类型和新类型,并且我们不能为所有类型创建别名(某些类型是函数)。这将创建一个升级锁。这是否意味着 Twirp 库需要+incompatible永远保持模式?

4

1 回答 1

2

我们如何迁移 Twirp 库以使用 go 模块而不强制其他库更新其导入路径?

你不能。

如果您go.mod将模块声明为github.com/twitchtv/twirp/v7,那么每个客户端库(以及您自己的包)都必须更新导入路径。这就是语义导入路径在 Go 模块中的工作方式。

如果你使用v1orv0模块路径——它是不带后缀的——你违反了 semver 合同,因为你的项目实际上已经有v7标签。

这里的主要问题是单个服务可能会导入在不同版本上生成的多个 Twirp 客户端

迁移到 Go 模块以一种简洁的方式显式地解决了这个问题,即导入项目多个版本的客户端只需将导入声明为github.com/twitchtv/twirp/vXetc,从而在.go文件中立即显示他们正在使用的版本。

实际上,您有一个非常简单的方法来处理这个问题。只需迁移到 Go 模块,将您的模块声明为具有下一个主要版本后缀github.com/twitchtv/twirp/v8,然后标记它v8.x.y。从 semver 的角度来看,这是正确的,因为您的更改确实是破坏性的——您的客户必须更改导入路径。

这样,想要迁移到您的 Go 模块版本的客户端将知道会发生什么并处理切换到新的主要版本的影响,包括重写导入路径。而不想迁移的客户可以继续导入v7.x.y(或更少)为+incompatible.

于 2021-04-15T09:21:27.540 回答