使用GoCenter查找要运行的模块的主要版本

更新:自2021年5月1日起,GoCenter中央存储库已被淘汰,所有功能将被弃用。有关中心日落的更多信息,请阅读弃用博客文章
给定的有多少个主要版本去模块有吗?这个简单的问题并不总是有一个容易发现的答案。
Golang独特的语义导入版本控制系统解决了确保Go模块跨依赖兼容性的一些关键问题。但这也使得了解一个Go模块的主要版本变得有点困难。go客户端没有提供查找方法,也不会在存在依赖项的新主版本时通知您。
如果你只是想要绝对最新的版本,你怎么知道它是什么或在哪里?
GoCenter有一个简单但功能强大的新特性,可以帮助开发人员了解对于任何Go模块版本,是否有其他可用的主要版本。它还将通知您该版本的任何替代路径。
有了这些信息,您可以做出最明智的选择,选择需要哪个版本的Go模块作为依赖。
Go模块版本控制系统
在Go 1.13中,模块已经成为Go生态系统的默认依赖管理。
Go模块的版本遵循的规则语义版本控制,遵循v(major).(minor).(patch)的形式:
- 当你进行不兼容的API更改时,MAJOR版本
- 以向后兼容的方式添加功能时的MINOR版本
- 当您进行向后兼容的错误修复时,PATCH版本。
在一个主要版本中,新版本应该与早期版本向后兼容。例如,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去模块为HelmKubernetes包管理器。除了helm.sh \舵导入路径是我们最初找到的,我们可以看到导入路径helm helm.sh \ \ v3可以使用头盔3。

GoCenter还列出了其他路径所有其他导入路径具有相同的Helm v1源。
的主要模块版本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模块被引用,并将其更新为新的主版本路径。
例如,要更新到盔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导入路径。
导入“模块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模块库如何帮助您快速可靠地交付应用程序!
