SemVer

GitHub release Tests Codacy Badge codecov Docs

此仓库包含 Version 结构体的完整实现,该结构体符合语义版本控制的规则,这些规则在 semver.org 中进行了描述。

安装

将以下依赖项添加到您的 Package.swift

.package(url: "https://github.com/sersoft-gmbh/semver", from: "5.0.0"),

兼容性

Swift SemVer 包
< 5.3.0 1.x.y - 2.x.y
>= 5.3.0, < 5.9.0 3.x.y
>= 5.9.0 5.x.y

用法

创建版本

您可以像这样创建一个版本

let version = Version(major: 1, minor: 2, patch: 3,
                      prerelease: "beta", 1, // prerelease could also be ["beta", 1]
                      metadata: "exp", "test") // metadata could also be ["exp, test"]
version.versionString() // -> "1.2.3-beta.1+exp.test"

当然,还有更简单的方法

let initialRelease = Version(major: 1)
initialRelease.versionString() // -> "1.0.0"

let minorRelease = Version(major: 2, minor: 1)
minorRelease.versionString() // -> "2.1.0"

let patchRelease = Version(major: 3, minor: 2, patch: 1)
patchRelease.versionString() // -> "3.2.1"

还有一个 Swift 用于静态创建版本。

版本字符串

如上面的示例所示,有一个函数可以返回 Version 的字符串表示形式。versionString(formattedWith options: FormattingOptions = default) 函数允许使用传递的选项检索格式化的字符串。默认情况下,返回完整版本。目前存在以下选项

let version = Version(major: 1, minor: 2, patch: 3,
                      prerelease: "beta",
                      metadata: "exp", "test")
version.versionString(formattedWith: .includePrerelease]) // -> "1.2.3-beta"
version.versionString(formattedWith: .includeMetadata) // -> "1.2.3+exp.test"
version.versionString(formattedWith: []) // -> "1.2.3"

let version2 = Version(major: 2)
version2.versionString(formattedWith: .dropPatchIfZero) // -> "2.0"
version2.versionString(formattedWith: .dropTrailingZeros) // -> "2"

Version 也可以从字符串创建。由 versionString 函数创建的所有字符串都应产生与创建它们的 Version 相同的版本

let version = Version(major: 1, minor: 2, patch: 3,
                      prerelease: "beta",
                      metadata: "exp", "test")
let str = version.versionString() // -> "1.2.3-beta+exp.test"
let recreatedVersion = Version(str) // recreatedVersion is Optional<Version>
recreatedVersion == version // -> true

比较版本

Version 也可以与其他版本进行比较。这也遵循语义版本控制的规则。这意味着 metadata 对比较完全没有影响。这也意味着有和没有元数据的版本被视为相等

let versionWithMetadata = Version(major: 1, minor: 2, patch: 3,
                                  metadata: "exp", "test")
let versionWithoutMetadata = Version(major: 1, minor: 2, patch: 3)
versionWithMetadata == versionWithoutMetadata // -> true

否则,比较两个 Version 基本上是比较它们的主版本号/次版本号/补丁号。带有 prerelease 标识符的 Version 排序在没有 prerelease 标识符的相同版本之前

let preReleaseVersion = Version(major: 1, minor: 2, patch: 3,
                                prerelease: "beta")
let finalVersion = Version(major: 1, minor: 2, patch: 3)
preReleaseVersion < finalVersion // -> true

如果您需要检查两个版本是否完全相同,可以使用 isIdentical(to:) 方法,该方法还会检查 metadata

有效性检查

Version 对其字段执行一些有效性检查。这意味着,majorminorpatch 不允许使用负数。此外,prereleasemetadata 字符串必须仅包含字母数字字符以及 -(连字符)。但是,为了保持 Version 在生产环境中的安全性,这些规则仅在非优化构建中检查(使用 assert())。在优化构建中使用不允许的数字/字符的结果是不确定的。虽然调用 versionString() 很可能不会崩溃,但肯定无法使用 init(_ description: String) 重新创建包含无效数字/字符的版本。

可编码

Version 符合 Codable!可以使用 .versionEncodingStrategy.versionDecodingStrategy CodingUserInfoKey 来控制编码/解码行为。对于 JSONEncoder/JSONDecoderPropertyListEncoder/PropertyListDecoder,有便捷属性 semverVersionEncodingStrategy/semverVersionDecodingStrategy 可用。

此包还提供了一个 SemVerMacros 产品。这是一个单独的产品,这样,如果实际上不需要宏,则不会为 SemVer 用户编译 SwiftSyntax。如果应从编译时已知的 String 构造 Version,则可以使用 #version 宏。它将在编译时解析 String,并生成从结果初始化 Version 的代码

let version = #version("1.2.3")

结果为

let version = Version(major: 1, minor: 2, patch: 3, prerelase: [], metadata: [])

文档

API 使用头文档进行记录。如果您希望以网页形式查看文档,则有一个 在线版本 可供您使用。

贡献

如果您发现错误/希望在 SemVer 中看到新功能,可以通过几种方式提供帮助

许可证和版权

请参阅 LICENSE 文件。