Swift包管理工具
Swift的包管理工具有以下三个
swift-package-manager(推荐)
- Apple官方提供,采用Swift编写
- 采用swift-llbuild构建编译。swift-llbuild是一个并行、高效、增量编译的构建引擎,所以编译速度快,不会对不变的依赖进行重复编译。
- 支持跨平台,比如windows,linux,macOS,darwin。
- 支持executable类型,所以可以用来写命令行工具。
- 自动生成package.xcworkspace和并支持命令行生成.xcodeproj
- 采用了Swift作为配置描述语言,在Package.swift文件中进行配置,写起来更加清晰方便。
- 使用git tag来做版本依赖,格式上遵循Semantic Versioning。
- 去中心化,没有统一的管理中心,所以没有更新中心服务器文件索引的这种耗时步骤
Cocoadods
- 采用ruby编写
- 自动化/侵入性高:一键配置和集成依赖/自动更改 Xcode.project 的配置
- 自动建立和更新一个 Xcode workspace,用来管理项目和所有依赖。
- CocoaPods的工程目录必须有一个podspec文件,其中包含有关项目的元数据并指定了工程的的编译方式。
- 中心化,提供各个源管理仓库配置文件,所有更新仓库文件索引可能会很慢。
Carthage
- 采用Swift编写
- 通过xcodebuild将依赖库打包成framework,这样可以减少开发过程中的编译时间。
- Cartfile文件格式是基于OGDL(Ordered Graph Data Language)标准来组织的,这种格式支持3种类型的数据源:github和git、binary。
- 在 Xcode 里定位到源码不方便,是很麻烦,不方便调试。
- 因为Carthage去中心化,不修改xcodeproj,也不生成xcworkspace文件,所以需要手动引入依赖库,很繁琐。
- 去中心化
使用swift-package-manager(SPM)添加库
暂时并不推荐使用SPM,因为它还不够成熟,且资料也不多,现在使用它会可能踩很多坑,因此建议先继续使用Cocoadods
输入三方库的Git地址
选项详解:
Up to Next Major: 当前指定的版本号到下一个大版本号之间的最新版本,例如 2.0.0 ~ 3.0.0(不包含 3.0.0)
Up to Next Minor: 当前指定的版本号到下一个次版本号之间的最新版本,例如 2.0.0 ~ 2.1.0(不包含 2.1.0)
Range: 指定的两个版本号之间的最新版本,例如 2.1.0 ~ 2.7.2(不包含 2.7.2)
Exact: 指定使用某一具体的版本号
创建 Swift Package
创建自己的 Swift 包,有两种方式:
在 Xcode 中找到 File -> New -> Swift Package
即可进入创建流程。
Swift Package相当一个Swift项目,只是目录结构有所不同;项目结构大致如下:
- Package.swift: 包的清单文件,用于描述包的名称、内容、依赖关系、支持的 Swift 版本号;
- Sources: 源码文件夹,通常包括 C/C++ 代码和 Swift 代码等;
- Tests: 单元测试代码
Package.swift 文件示例
import PackageDescription
let package = Package(
name: "swift_package_demo",
products: [
.library(
name: "swift_package_demo",
targets: ["swift_package_demo"]),
],
dependencies: [
.package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", from: "3.0.0"),
],
targets: [
.target(
name: "swift_package_demo",
dependencies: []),
.testTarget(
name: "swift_package_demoTests",
dependencies: ["swift_package_demo"]),
]
)
products
:是 Package 编译后对外的产品输出,一般可分为两种类型:可执行文件、静态库或者动态库;其中.library("swift_package_demo")
配置了第三方 App 引用时,需要 import 的 module 名。比如:.library("demoPackage")
,在其他 App 中添加了这个 Package 后,使用 import demoPackage
即可。
dependencies:定义了当前 Package 依赖的第三方库
targets
:是 Package 的基本构件,和 xcodeproject
一样,Package 可以有多个 target
;target
分为三种类型:常规型、测试类型、系统库类型。以 .target("swift_package_demo")
为例,程序会自动到 Source 文件夹里寻找名为 swift_package_demo
的文件夹,并把里面所有 public 属性作为接口开放出来。
Targets
的几个主要属性(详见:https://juejin.im/post/5df32bcc518825125a638456)
- name:名字
- dependencies:依赖项,注意不要和上面的
Package.Dependency
搞混了,不是一个东西,这里可以依赖上面Package.Dependency
的东西或者依赖另一个target
。所以这里只需要写 Package 或者 Target 的名字字符串(Target.Dependency
这个枚举也实现了ExpressibleByStringLiteral
)。 - path:
target
的路径,默认的话是[PackageRoot]/Sources/[TargetName]
。 - source:源文件路径,默认
TargetName
文件夹下都是源代码文件,会递归搜索 - exclude:需要被排除在外的文件/文件夹,这些文件不会参与编译。
- publicHeadersPath:C 家族库的公共头文件地址。
- swiftSettings:定义一个用于特定环境(例如 Debug)的宏,需要设置的话可以去
API
上研究下 - linkerSettings:用于链接一些系统库
使用 Xcode 测试Swift Package
编写Swift代码可以通过 VSCode、Atom 加入各种插件,甚至 txt 文本编辑器写;但是肯定还是 Xcode 用起来比较方便。
默认 swift build 是不会生成 packageName.xcodeproj
这种 Xcode 可以直接打开的工程文件,但是可以通过 swift package generate-xcodeproj
命令行生成一个 .xcodeproj
文件,然后就可以通过 Xcode 运行该项目了,如果需要配置什么环境变量,则需要通过 Build Setting
中的选项配。
需要注意的一点事,通过 swift run 和通过 Xcode 启动的是不同的进程,两种方式生成的可执行文件并不是同一个,所以如果需要把可执行文件更新到其他地方的时候注意别弄错了。
1> 确保xcode命令行配置正确:
2> 关闭Seift Package项目,从终端cd到Swift Package项目根目录下,执行命令生成 .xcodeproj 文件:
swift package generate-xcodeproj
3> 重新打开项目
在单元测试中就可以测试代码了
更多资料:https://juejin.im/post/5df32bcc518825125a638456
https://juejin.im/post/5e1864855188254c257c37c3