SwiftPM

Swift Package Manager简称SwiftPMSPM,是用来管理Swift代码分发的工具,它与Swift构建系统集成在一起,可以自动处理代码的下载、编译和依赖链接。Swift 3.0及之后的版本中默认包含Swift Package Manager


Swift通过模块来组织代码,每一个模块都有一个对应的命令空间,模块中包含的代码会被指定哪些部分可以被外部访问,哪些代码只能在模块内部使用。对于一个程序,可能所有的代码都写在一个模块中,也可能这个程序依赖了其它人写的模块。除了系统提供的模块可以被程序依赖以外,大部分情况下,我们写程序所依赖的其它模块都需要被先下载到本地,然后按指定顺序进行编译。

假设为了解决一个特定的问题我们写了一个模块,如果其它场景也要解决同一个问题,就可以把这个已经写好的模块直接拿过来使用,不需要重新再写一遍,这就是使用模块的好处。模块可以被复用,来提高生产效率。


Swift Package Manager中,有几个概念需要先明确一下:

  • 包(Package): 一个包具体由Swift源码文件、清单文件(manifest)及资源文件(图片、视频、音频、文本)组成。清单文件命名为Package.swift,使用PackageDescription模块定义了这个包的名称及包中包含的具体内容。从概念上来看,一个包中可能包含一个或多个编译目标(Target), 每一个编译目标会依赖一些其它的模块,一个编译目标经过编译器处理后会生成一个产物(Product)。
  • 产物(Product): 一个编译目标(Target)经过编译器处理后生成的产物可以分为两类:库(library)可执行文件(executable)库(library)中可以包含多个模块,可执行文件(executable)可以被操作系统调起运行。
  • 依赖(Dependency): 一个编译目标(Target)可能需要依赖其它模块才能被编译器成功编译生成产物,而依赖的模块可能存在于其它的包中。我们描述依赖的时候通常会使用一个url及对应的版本号来指定,Swift Package Manage的作用就是自动的处理一个项目所依赖的所有包的下载工作并调用Swift工具链进行编译。一个包内部还会依赖其它包,这是一个递归的过程,可以用一棵依赖树来表示,Swift Package Manager就是解析这棵依赖树,下载所有的包并执行完成编译任务生成对应产物。