什么是SwiftPM
SwiftPM(Swift Package Manager)
是 2018 年苹果官方推出供 Swift 开发者进行包管理的工具,相当于我们一直使用的Cocoapods,及近年来开始火的Carthage。
为什么要推出SwiftPM
CocoaPods
使用最广泛的工具,依赖放在各个源(master 或者 自己的源)上的 podspec 文件进行下载代码库,在本地生成一个 workspace 进行统一管理、添加依赖。
- 自动化/侵入性高:一键配置和集成依赖/自动更改 Xcode.project 的配置
- 中心化:提供各个源管理仓库配置文件,所有更新仓库文件索引可能会很慢。
- 缓存:除了项目根目录的缓存之外,还有较完整的本地缓存体系,所以不同工程下载同一个库时会直接从本地拿。
Carthage
- 去中心化:没有统一管理的中心,所以没有更新中心服务器的文件索引这种耗时步骤
- 成本略高/侵入性低:Carthage 只会帮你把各个库下载到本地(默认会编译成静态库),具体的 Project 配置需要自己弄
- 生态环境:很差,很多库都没有提供这种依赖方式
- 缓存:只有项目根目录的缓存,所以不同项目对于同一个库需要重新下载
SwiftPM来了
官方推出,值得信赖。Swift编写,Xcode自动集成,不需要第三方脚本来管理,无需配置环境,实现CocoaPods的所有功能,对项目本身无影响,无侵入,经测试编译速度和CocoaPods相当。
在Xcode中的使用
点击项目-PROJECT-+,如图:
打开如下页面,在输入框中输入要安装的三方库git地址,如Snapkit的 https://github.com/SnapKit/SnapKit 点击next。
导入规则 Rules
有三个选项: Version
、Branch
、Commit
。
其中的 Version 可指定库的版本更新规则:
Up to Next Major
: 直到下一个大版本(5.2.2 ~ 6.00)Up to Next minor
: 直到下一个中版本(5.2.2 ~ 5.3.0)Range
: 限定版本范围(自定义范围)Exact
: 指定固定版本(5.2.2)
没有特殊需求就使用默认选项,点击 Next
按钮,等待 Xcode 从网上拉取完毕,如搜索结果有多格如下图,请勾选要搜索的库,然后点击finish,如未勾选,目录里有但是无法import
点击finish即可在目录栏中看到新出现的三方库库目录Swift Package Dependencies
有在Source目录下显示三方库的源码,并且多了Example目录,展示使用三方库使用方法的demo
Pacakage.swift三方库相关配置文件,配置文件中采用声明式语法创建了一个 Package
对象,Package
类来自 PackageDescription
包 ,其主要作用是对包的描述。图中 Almofire 的配置参数如下:
name: 包名
platforms: 支持的平台
products: 编译后的library
targets: 包中包含的targets,其中.testTarget是供测试的target
swiftLanguageVersions: 库所使用的的 Swift 版本
除此之外,dependencies
参数为库指定依赖的库,SwiftPM 会自动加载
所有依赖的库。例如在引入 Realm 时,其依赖于 RealmCore, Package.swift 中可以看到该字段:
let package = Package(
//......
dependencies: [
.package(url: "https://github.com/realm/realm-core",.exact(Version(coreVersionStr)!)),
],
//......
在 SwiftPM 加载时会自动加载指定 url 处的 realm-core。加载完毕后可在 Swift Package Dependencies 中看到 RealmCore。
更多配置相关的参数可以进入到 PackageDescription
库查看(即 Package.swift 文件头部 import 的 PackageDescription)
导入三方库的配置文件不需要我们更改什么,如果是我们自己创建的库给别人使用,或者直接将 SwiftPM 用来工程模块化,就需要自定义 Package.swift 中的参数。
调用三方库
import SnapKit
更新仓库版本号
右击当前库-Update Package即可
用Swift PM制作自己的组件
新建Swift PM库,命名为SwiftPMTest,创建完毕后Xcode自动为我们生成好了库的结构
将代码和资源文件加入到该模块的 Source文件夹
中。
组件配置文件:package.swift,
内容
包括:
name :组件名
platforms:支持的平台
platforms可以配置支持的平台版本,支持最低iOS10,.iOS(.v10)
Dependencies
若有依赖于其他库可在 .dependencies
字段后添加所依赖库的git地址,url:依赖库的git地址,from:依赖库的版本号
targets
Swift将代码组织到模块中。每个模块都指定一个名称空间,并强制执行访问控制,以便可以在该模块外部使用该代码的哪些部分。可以将所有代码都放在一个模块中,也可以将其他模块作为依赖项导入。将解决特定问题的代码提取到一个单独的模块中,可以在其他情况下重用该代码。
Products
目标可以构建库或可执行文件作为其产品。一个库包含一个可以被其他Swift代码导入的模块。可执行文件是可以由操作系统运行的程序。
swiftLanguageVersions
swift语言版本
let package = Package(
name: "MySwiftPakage",
platforms: [
.iOS(.v10),
.macOS(.v10_12),
.tvOS(.v10)
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "MySwiftPakage",
targets: ["MySwiftPakage"]),
],
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.0.0")),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "MySwiftPakage",
dependencies: []),
.testTarget(
name: "MySwiftPakageTests",
dependencies: ["MySwiftPakage"]),
],
swiftLanguageVersions: [
.v5
]
)
其它配置请参考官方文档:https://github.com/apple/swift-package-manager/blob/main/Documentation/Usage.md
配置好建好git仓库,上传git,用做测试的git地址:https://github.com/Leo623/SwiftPMTest
$ git init
$ git add .
$ git remote add origin [https://github.com/Leo623/SwiftPMTest]
$ git commit -m "第一次SwiftPM测试"
$ git push origin master
$ git tag 1.0.0
$ git push --tags
传上去后就可以在项目中使用了,是不是非常简单好用呢