当Swift于2015年底开源时,随之而来的最令人惊讶和最有趣的新项目之一是Swift Package Manager。虽然它不是Swift项目的第一个依赖管理器,但它是第一个由Apple正式提供和支持的,许多开发人员认为这是一个非常好的消息。
然而,虽然服务器端Swift社区迅速采用Swift Package Manager作为构建服务器应用程序时管理依赖关系的首选工具,但它需要花费很长时间才能完全集成到Apple的其他开发人员工具链中。
但是现在,从Xcode 11开始,Swift Package Manager终于成为Apple开发人员工具套件中真正的一流公民 - 所以本周,我们来看看如何使用它来管理项目的各种依赖 - 内部和外部的。
Swift包的解剖结构
甲夫特封装基本上是一组被编译在一起以形成夫特源文件模块 -其然后可以共享和导入其他项目为一个单元。包可以是使用GitHub等服务共享的公共库,也可以是仅在少数项目中共享的内部工具和框架。
使用Package.swift
清单文件声明包的内容,清单文件放在每个包的根目录中。Swift包清单文件不是使用JSON或XML等数据格式,而是使用实际的Swift代码编写的 - 使用Package
实例表示包的声明。
举个例子,假设我们正在研究todo列表应用程序,并且我们想要为TodoKit
应用程序中共享的所有核心逻辑创建一个包 - 包括我们的数据库层,模型代码等等。上。首先,我们将创建一个新文件夹(名称与我们希望调用包的名称相匹配),然后我们将swift package init
在其中运行以创建我们的包:
$ mkdir TodoKit
$ cd TodoKit
$ swift package init
在Xcode 11中,我们还可以使用File > New > Swift Package
menu命令执行上述设置。
通过执行上述操作,Swift Package Manager现在将为我们的新包创建一个初始结构 - 其中包含一个Package.swift
类似于以下内容的清单文件:
// swift-tools-version:5.1
import PackageDescription
let package = Package(
name: "TodoKit",
products: [
// The external product of our package is an importable
// library that has the same name as the package itself:
.library(
name: "TodoKit",
targets: ["TodoKit"]
)
],
targets: [
// Our package contains two targets, one for our library
// code, and one for our tests:
.target(name: "TodoKit"),
.test