如果您正在使用 Go 并使用 语义版本控制 (SemVer), 有时您会想要比较 Go 应用程序中的版本。标准库没有可以做到这一点的包。幸运的是,有一些社区包可以提供帮助。在这里,我们将查看两个具有不同功能集的此类软件包。
github.com/hashicorp/go-version
专为 SemVer 设计,这个来自 Hashicorp 的 包有许多可以很好地协同工作的对象,为使用版本提供了基础。它包括比较版本、查看版本是否匹配一组约束,甚至订购一组版本的能力。
比较
为了比较两个版本,为每个版本创建一个 version.Version 对象,然后将两个版本比较为大于、小于或等于。例如:
v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
fmt.Printf("%s is less than %s", v1, v2)
}
其他比较函数是
Equal
和
GreaterThan
。
约束条件
有时您会想要将一个版本与一组约束进行比较。例如,您要确保版本大于 1.3,因为在该版本中添加了一项功能,并且小于 API 更改的版本 2.0。
v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
fmt.Printf("%s is less than %s", v1, v2)
}
github.com/mcuadros/go-version
如果您有兴趣将版本作为字符串使用或处理不使用 SemVer 的版本,那么这个包可能更适合您。它的灵感来自 PHP 中的 Composer 和版本处理。
归一化然后比较
在比较版本字符串之前,您需要对其进行规范化。有一个方便的功能可以做到这一点。
v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
fmt.Printf("%s is less than %s", v1, v2)
}
比较
这个包中有两个函数用于处理比较。
v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
fmt.Printf("%s is less than %s", v1, v2)
}
如果第一个版本较新,则响应为
1
,如果第二个版本较新,则响应为
-1
,如果它们相同,则响应为
0
。
version.Compare
允许您使用比较字符串指定第三个参数。例如,
v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
fmt.Printf("%s is less than %s", v1, v2)
}
这些的响应是
bool
值。
约束条件
与 Hashicorp 的包一样,您可以设置约束并查看版本是否与它们匹配。
v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
fmt.Printf("%s is less than %s", v1, v2)
}
由于版本在限制范围内,因此响应为
true
。该文档提供了大量示例和有关您可以比较的字符串的大量详细信息。