微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使版本 v2+ 的 Go 模块避免导入路径前缀要求?

如何解决如何使版本 v2+ 的 Go 模块避免导入路径前缀要求?

这是特定于: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 模式?

解决方法

如何在不强制其他库更新导入路径的情况下迁移 Twirp 库以使用 go 模块?

你不能。

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

如果您使用 v1v0 模块路径(不带后缀),您违反了 semver 合同,因为您的项目实际上已经有 v7 标签。

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

迁移到 Go 模块以一种干净的方式明确地解决了这个问题,即导入项目的多个版本的客户端只需将导入声明为 github.com/twitchtv/twirp/vX 等,这使得在 .go 文件中也可以立即看出它们的版本正在使用。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。