使用GoCenter查找Go模块主要版本的路径

更新:截至2021年5月1日,GoCenter中央存储库已经日落,所有功能将被弃用。有关中心日落的更多信息,请阅读弃用博客文章
给定的东西有多少个主要版本去模块有吗?这个简单的问题并不总是有一个容易发现的答案。
Golang独特的语义导入版本控制系统解决了确保Go模块跨依赖的兼容性的一些关键问题。但这也使得学习Go模块的主要版本变得更加困难。go客户端没有提供一种方法来查找,也不会在某个依赖项存在更新的主版本时通知你。
如果你只是想要绝对最新的版本,你怎么知道它是什么或在哪里?
GoCenter有一个简单但功能强大的新功能,可以帮助开发人员了解,对于任何Go模块版本,是否有其他主要版本可用。它还会告诉您该版本的任何替代路径。
有了这些信息,您就可以做出最明智的选择,决定需要哪个版本的Go模块作为依赖项。
Go模块版本控制系统
在Go 1.13中,模块已经成为Go生态系统的默认依赖管理。
Go模块的版本遵循语义版本控制,遵循形式v(major).(minor).(patch):
- 当你做出不兼容的API更改时,主版本;
- MINOR版本,当您以向后兼容的方式添加功能时
- 补丁版本,当您进行向后兼容的错误修复。
在主版本中,新版本应向后兼容较早版本。例如,v1.2.3必须与v1.2兼容。X,而是v2。xneed not be compatible with any of those.
但是Go模块的版本也必须遵循导入兼容性规则(在Go 1.11中正式定义),它说:
“如果旧包和新包具有相同的导入路径,新包必须向后兼容旧包。”
这意味着每个Go模块的主要版本(例如,v1。x, v2。x,and v3.x) must occupy its own unique import path. By convention, Go module versions v0 and v1 occupy the base import path (i.e., the master branch of its source repo), while all module major versions v2 or higher include/ vN在模块路径的末尾。(对于Go模块作者,我将在下面描述这一点。)
调用这个Go模块方法来遵守语义版本控制和导入兼容性的规则语义导入版本控制。

这种路径形式的变体也可以被go客户端识别,后面跟着gopkg.inservice。在这里,主版本通过表单的扩展后缀在导入路径中标识vn。例如,gopkg.in / yaml.v2。
GoCenter解决方案
GoCenter是超过100万个版本的Go模块的免费中央存储库。通过如下方式设置你的GOPROXY:
$ export GOPROXY=https://gocenter.io
你的go客户端可以从这个单一的、不可变的、永远可用的存储库中解析所有开源的go模块依赖。
GoCenter丰富的用户界面还允许你搜索你需要的Go模块,并通过每个版本中存储的丰富的、以安全为中心的元数据了解它们的详细信息:
- 模块使用的依赖项
- 什么其他Go模块使用这个模块作为依赖项
- Godoc模块文档
- 重要的使用指标
- Go模块安全漏洞在JFrog x射线的深度递归扫描中发现的
- 所有可用的版本(包括pseudo-versions)从导入路径
使用GoCenter的新功能,您可以检查其他可用路径下拉列表可发现所有其他主要版本导入路径,以及同一源的任何其他可用导入路径。
例如,让我们看看v1为舵手的Go模块Kubernetes包管理器。除了helm.sh \舵我们最初找到了导入路径,可以看到导入路径helm helm.sh \ \ v3可以使用Helm 3。

GoCenter还列出了其他路径具有相同的Helm v1源的所有其他导入路径。
中模块的主要版本Gocenter也支持gopkg.in使用可变路径形式的域(例如:vn在模块路径的末尾)。的列表YAML v1的Go模块(gopkg.in / yaml.v1),确定了v2和v3的其他主要版本(gopkg.in / yaml.v2,gopkg.in / yaml.v3).

更新新主版本的Go依赖项
go客户端提供了一种简单的方法,通过命令将依赖项更新到最新的模块版本得到-u。但此命令只会下载指定主版本的新的次要版本和补丁更改。
Go没有办法自动更新你的依赖来使用一个新的主版本——你也不希望它这么做!根据定义,主要版本与以前的主要版本不向后兼容。单独更新主版本参考会破坏您的代码!
一旦你通过GoCenter找到了一个模块的新主版本,你希望你的代码使用,你需要检查和更新你的Golang代码的API变化引入的主版本。
然后,您可以更新Golang代码的依赖项,以引用新的导入路径。GoCenter提供了一个简单的方法来获取完整的导入路径和版本字符串到剪贴板中:

在你的代码库中,你需要找到每一个进口语句,其中引用了Go模块,并将其更新为新的主版本路径。
例如,要更新到Helm 3:
进口“舵/ helm.sh / v3”
如果您的Golang代码打包为Go模块,则还需要更新需要你的声明go.mod文件为新的导入路径,还要指定特定的版本号。
需要helm.sh/helm/v3 v3.4.2
创建新模块版本
如果你是一个Go模块作者,当你引入一个不向后兼容的更改(比如一个重要的API更改)时,你需要创建一个新的模块主版本。
如果您是第一次为已经标记为v2.0.0或更高版本的现有存储库或包集采用模块,那么推荐的最佳实践是在第一次采用模块时增加主版本。
要创建现有模块的新主版本,有两种方法:
维护多个主版本
如果需要维护多个主版本,请使用此方法。要在一个新的主版本(例如v3)上开始开发,创建一个新的v3子目录,并放置一个新的go.mod该子目录下的文件。模块路径必须以。结尾/ v3。将模块代码复制到v3子目录,并更新相关进口语句也可以使用/ v3导入路径。
导入module github.com/myrepo/mymodule/v3/mypkg
用v3.x.y标记发行版。
只维护当前的主要版本
如果您只维护当前的主要版本,请使用此方法。更新当前go.mod要包括的文件/ v3的模块路径的末尾模块指令。
模块github.com/myrepo/mymodule/v3
更新进口语句也可以使用/v3,如第一个方法所示。用v3.x.y标记发行版。
通往GoCenter的捷径
Go模块继续发展,即使现在它们已经成为Golang的标准包管理系统。GoCenter也在不断发展,为开发人员提供丰富的元数据,帮助他们充分利用这些社区Golang包。
现在探索GoCenter了解这个数据丰富的不可变Go模块库如何帮助您快速可靠地交付应用程序!