0%

Swift Package 的创建和使用

Xcode 11 已经有了对 Swift Package 的支持,今后使用 Swift 编写的 iOS 项目就可以开始尝试使用 SwiftPM 逐步替换 CocoaPods 和 Carthage 了。常用的使用 Swift 编写的三方库如 AlamofireMoya 等也都已经支持了 SwiftPM。

本文通过一个例子来介绍 Swift Package 的创建、发布以及使用。

准备工作

由于打算将创建的 Package 发布到 Github,首先需要在 Xcode 上登陆 Github,这将方便后续的上传和下载集成。

Swift Package 的创建

Xcode 快捷键 shift + control + command + N 可以快速创建一个 Swift Package,我们命名为 Hello。创建项目的时候勾选 Create Git repository on my Mac,因为后续还要上传 Github。

创建后,目录中会有一个 Package.swift 文件,一个 Sources 文件夹包含着这个包将要包含的代码,以及一个 Tests 文件夹包含测试文件。

其中,Hello.swift 文件中代码为

1
2
3
struct Hello {
var text = "Hello, World!"
}

由于做成 Package 之后就是跨模块访问,我们加上访问控制关键字,并创建一个构造器(因为默认的构造器是 internal 关键字),然后增加一个方法。

1
2
3
4
5
6
7
8
9
10
11
12
public struct Hello {

var text: String

public init(with text: String = "Hell, World!") { // there is a bug.
self.text = text
}

public func sayHi() -> String {
return text
}
}

之后我们可以提交并上传了,但是这里我们预留了一个 bug。

我们将代码推到 Github 上的流程,可以先在 Github 上创建一个空项目,然后本地和远程仓库关联,也可以直接通过 Xcode 在 Github 上创建一个远程仓库(因为已经在 Xcode 上登陆了 Github,这一步非常简单)。这个仓库完全可以设置为私有的,也就是说我们为自己项目创建的 Package 是可以托管在 Github 上的。

下一步是为当前 Git 版本打标签,这将成为 Package 的版本号。需要说明的是,这个版本号是遵守语义化版本控制规范的,具体可参考 Semantic Versioning 2.0.0。打了标签之后,记得还需要 Push 一次,将标签同步到远程仓库中。至此,我们已经创建一个 Swift Package 并上传到了 Github。

Swift Package 的使用

我们再新建一个项目,名为 Demo,之后尝试添加之前的 Package。

图 1 - 创建 Swift Package

点击加号后,由于已经登陆了 Github,弹出的列表中可以找到之前创建的 Package,当然也可以复制 URL 进行搜索。找到后,会提示我们设置版本规则。其中,默认的 Up to Next Major 的意思是从指定的版本到下个大版本,这样进行小版本更新时,我们可以轻松对 Package 进行更新。再次点击下一步后,会提示选取 Product 以及添加到的 Target,我们都不加修改点击完成。这样,这个 Package 就集成到我们都项目中了。

之后我们在项目中使用一下。

1
2
3
4
5
6
7
8
9
10
//
// main.swift
// Demo
//

import Foundation
import Hello

let hello = Hello()
print(hello.sayHi()) // Hell, World!

至此,我们成功地在项目中集成并使用了一个 Swift Package。

修改 Package

我们这个 Package 是有问题的,输出的不是 Hello 而是 Hell

所以我们进一步可以去修改那个 Package,然后再次上传。对于新的版本需要打一个新的标签,由于只是 bug 修复,新版本就是 1.0.1

之后对于 Demo 项目,要做的只需要更新 Package 到最新版本,操作是 File->Swift Packages->Update to Latest Package Versions,之后这个 Package 就会更新到 1.0.1 版本,这个项目我们不修改任何代码重新运行,打印结果从 Hell, World! 修正为 Hello, World!

参考文献

  1. Adopting Swift Packages in Xcode
  2. Creating Swift Packages