版本 badge-platforms badge-languages badge-ci badge-jazzy badge-codecov

一个 µ-framework,用于表示、比较、编码和使用 语义化版本,例如 1.2.32.0.0-beta

这是来自 Swift Package ManagerVersion.swift,进行了一些小的调整

  1. 更紧凑的 Codable 实现 †
  2. 实现了 LosslessStringConvertible
  3. 不是巨型单源文件 (MSSF)
  4. 在线文档
  5. BundleProcessInfo 提供的扩展
  6. 移除了潜在致命的 ExpressibleByStringLiteral 一致性
  7. 一个“容错”初始化器,用于处理类似 10.0v3 的用户输入
  8. 符合语言习惯的 Range<Version> 实现
  9. 可以从 StringProtocol 初始化,而不仅仅是 String

我们对 Apple 仓库的更改进行自动监控,以便在我们需要合并任何修复时发出警报。

语义化版本 可以无损地表示为字符串;因此我们这样做。

‡ 就像 Int 一样,我们可以从有效的字符串中无损地存储语义化版本,因此我们遵循相同的协议。

支持 mxcl

大家好,我是 Max Howell。我是一位多产的开源软件开发者,您可能已经在使用我的一些软件(例如,我创建了 brew)。我全职从事开源工作,这很辛苦;目前 *我的收入低于最低工资*。请帮助我继续我的工作,我非常感谢 🙏🏻

其他感谢方式.

用法

import Version

// these two initializers are the same, use whichever suits the code context
let v1 = Version(1,0,0)
let v2 = Version(major: 1, minor: 0, patch: 0)

let v3 = Version("1.2.3")           // =>  1.2.3: Version?
let v4 = Version(tolerant: "10.1")  // => 10.1.0: Version?
let v5 = Version(tolerant: "10")    // => 10.0.0: Version?

// a real Version object from your app’s Info.plist
let v6 = Bundle.main.version

let range = Version(1,2,3)..<Version(2,0,0)

let null: Version = .null  // => Version(0,0,0)

let foo = Version(1,2,3) < Version(2,0,0)  // => true

安装

SwiftPM

package.append(.package(url: "https://github.com/mxcl/Version.git", from: "2.0.0"))

Carthage

等待中:@Carthage#1945

范围

范围的工作方式符合您的预期,但对于预发布标识符有一些注意事项,以下是规则

1.0.0..<2.0.0 不包括例如 2.0.0-alpha

这可能符合您的预期。但是

1.0.0..<2.0.0 也不包括例如 1.5.0-alpha

然而

1.0.0..<2.0.0-beta **确实** 包括例如 2.0.0-alpha

这是大多数语义化版本库的工作方式。

Comparable、Equatable & Hashable

根据规范,comparable 和 equatable 都会忽略构建元数据。因此

Version("1.2.3+14") == Version("1.2.3+15")  // => true
Version("1.2.3+14") <= Version("1.2.3+15")  // => true
Version("1.2.3+14") <  Version("1.2.3+15")  // => false

这也意味着 Hashable 必须反映此行为,因此

dict[Version("1.2.3+14")] = 1
dict[Version("1.2.3+15")] = 2
dict.count  // => 1
dict        // => ["1.2.3+15": 2]

请注意这一点,因为它可能会让您措手不及,自然地,这也会影响依赖于 Hashable 的结构,例如 Set