大部分语言都有官方的代码分配解决方案,幸好苹果也在开发能替代 CocoapodsCarthage 的管理工具。Swift Package Manager(Swift 包管理器,下面我们简称 SPM )就是一个用来管理 Swift 代码的分配的官方工具,它为 Swift 编译系统集成了自动进行下载、编译和连接依赖的过程。

目前,SPM 还处于早期阶段,现在仅支持 OS X 和 Linux 系统,尚不支持 iOS, watchOS 以及 tvOS 平台,但未来很大希望会支持上述平台。

本文使用苹果官方的例子来讲解 SPM 的使用,希望这篇文章能够帮到有意进行尝试的人! :)

概念概述

这个章节我们先来了解一下关于 SPM 功能的一些基本概念。

模块

在 Swift 中我们使用模块来管理代码,每个模块指定一个命名空间并强制指定模块外哪些部分的代码是可以被访问控制的。

一个程序可以将它所有代码聚合在一个模块中,也可以将它作为依赖关系导入到其他模块。除了少量系统提供的模块,像 OS X 中的 Darwin 或者 Linux 中的 Glibc 等的大多数依赖需要代码被下载或者内置才能被使用。

当你将编写的解决特定问题的代码独立成一个模块时,这段代码可以在其他情况下被重新利用。例如,一个模块提供了发起网络请求的功能,在一个照片分享的 app 或者 一个天气的 app 里它都是可以使用的。使用模块可以让你的代码建立在其他开发者的代码之上,而不是你自己去重复实现相同的功能。

一个包由 Swift 源文件和一个清单文件组成。这个清单文件称为 Package.swift,定义包名或者它的内容使用 PackageDescription 模块。

一个包有一个或者多个目标,每个目标指定一个产品并且可能声明一个或者多个依赖。

产品

一个目标可能构建一个库或者一个可执行文件作为其产品。库是包含可以被其他 Swift 代码导入的模块。可执行文件是一段可以被操作系统运行的程序。

依赖

目标依赖是指包中代码必须添加的模块。依赖由包资源的绝对或者相对 URL 和一些可以被使用的包的版本要求所组成。包管理器的作用是通过自动为工程下载和编译所有依赖的过程中,减少协调的成本。这是一个递归的过程:依赖能有自己的依赖,其中每一个也可以具有依赖,形成了一个依赖相关图。包管理器下载和编译所需要满足整个依赖相关图的一切。

下一个章节可能需要你了解一些 Swift 的基本知识,如果你是 Swift 的新手,可以先进这个传送门学习一下 Swift 的基本知识: Swift 入门教程

开源 Swift 入门

接下来,我们还需要了解一下开源 Swift 的一些入门知识。

  • 下载和安装 Swift
  • 使用 REPL
  • 使用编译系统
  • 使用 LLDB 调试器

由于本文重点不在这里,所以我们就简单介绍下如何下载和安装 Swift 以及如何使用编译系统, 关于 使用 REPL 和 LLDB 调试器的内容具体可以参阅官方文档 使用 REPL使用 LLDB 调试器

下载和安装 Swift

刚开始使用 Swift 需要下载并安装编译器和其他必备组件。进入到 https://swift.org/download/#releases 按目标平台的说明进行。

下载的时候需要注意下,由于 SPM 还不是特别的成熟,我们在这个教程中将不使用 Releases 的 Swift,我们需要下载开发版的 Snapshots。如下图所示,我们使用日期为 April 12, 2016 的 Snapshots,另外千万不要点击下载 Debugging Symbols 或者 Signature 的安装包,因为那样会缺失一些内置的依赖库!!

image

下载完成后点击按步骤安装就可以了!

OS X

在 OS X 上下载工具链默认的地址是 /Library/Developer/Toolchains。接着我们输入以下命令导出编译路径

1
$ export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:"${PATH}"
Linux

首先需要安装 clang :

1
$ sudo apt-get install clang

如果你在 Linux 上安装的 Swift 工具链在系统根目录以外的目录,你需要使用你安装 Swift 的实际路径来运行下面的命令:

1
$ export PATH=/path/to/Swift/usr/bin:"${PATH}"

导出路径之后,你可以通过输入 swift 命令并传入 --version 标志来校验你是否运行了 Swift 的预期版本

1
2
$ swift --version
Apple Swift version 3.0-dev (LLVM ..., Clang ..., Swift ...)

在版本号的后缀-dev用来表明它是一个开发的编译,而不是一个发布的版本。

使用编译系统

Swift 编译系统为编译库、可执行文件和在不同工程之间共享代码提供了基本的约定。

创建包

创建一个新的 Swift 包,首先创建并进入到一个新的目录命名为 Hello

1
2
$ mkdir Hello
$ cd Hello

每个包在其根目录下都必须拥有一个命名为 Package.swift 清单文件。如果清单文件为空,那包管理器将会使用常规默认的方式来编译包。创建一个空的清空文件使用命令: