此仓库包含 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)
函数允许使用传递的选项检索格式化的字符串。默认情况下,返回完整版本。目前存在以下选项
.dropPatchIfZero
:如果 patch
为 0
,则不会将其添加到版本字符串中。.dropMinorIfZero
:如果 minor
和 patch
都为 0
,则仅添加 major
数字。需要 .dropPatchIfZero
。.dropTrailingZeros
:.dropPatchIfZero
和 .dropMinorIfZero
的便捷组合。.includePrerelease
:如果 prerelease
不为空,则将其添加到版本字符串中。.includeMetadata
:如果 metadata
不为空,则将其添加到版本字符串中。.fullVersion
:.includePrerelease
和 .includeMetadata
的便捷组合。如果您不向 versionString
传递任何内容,则为默认值。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
对其字段执行一些有效性检查。这意味着,major
、minor
和 patch
不允许使用负数。此外,prerelease
和 metadata
字符串必须仅包含字母数字字符以及 -
(连字符)。但是,为了保持 Version
在生产环境中的安全性,这些规则仅在非优化构建中检查(使用 assert()
)。在优化构建中使用不允许的数字/字符的结果是不确定的。虽然调用 versionString()
很可能不会崩溃,但肯定无法使用 init(_ description: String)
重新创建包含无效数字/字符的版本。
Version
符合 Codable
!可以使用 .versionEncodingStrategy
和 .versionDecodingStrategy
CodingUserInfoKey
来控制编码/解码行为。对于 JSONEncoder
/JSONDecoder
和 PropertyListEncoder
/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 文件。