一、SPM库组成
1.1 Package.swift
组件分析
Package.swift 是整个包描述,它依赖 PackageDescription 结构,该结构定义了一个 SPM 导出包需要指定哪些配置信息:
// struct Package
init(
name: String,
defaultLocalization: LanguageTag? = nil,
platforms: [SupportedPlatform]? = nil,
pkgConfig: String? = nil,
providers: [SystemPackageProvider]? = nil,
products: [Product] = [],
dependencies: [Package.Dependency] = [],
targets: [Target] = [],
swiftLanguageVersions: [SwiftVersion]? = nil,
cLanguageStandard: CLanguageStandard? = nil,
cxxLanguageStandard: CXXLanguageStandard? = nil
)
- name:Swift包的名称;
- defaultLocalization:资源的默认本地化;
- platforms:支持的最低系统平台的列表;
- pkgConfig:用于C模块的名称。如果存在,Xcode将搜索.pc文件以获取系统目标所需的其他标志;
- providers:系统目标的程序包提供者;
- products:此软件包可让客户使用的产品列表;
- dependencies:软件包依赖项列表(可空,或需要其它外部依赖);
- targets:属于此软件包的目标列表(源码目录、测试目录);
- swiftLanguageVersions:此软件包兼容的Swift版本列表;
- cLanguageStandard:用于此程序包中所有C目标的C语言标准;
- cxxLanguageStandard:用于此程序包中所有C ++目标的C ++语言标准;
一般来说,上面的这些配置,通常,我们需要的是:name、platforms、products、dependencies、targets。
二、创建自己的SPM库
2.1可以使用Xcode创建或用命令行创建,这里只使用Xcode创建示例:
Xcode -> File -> New -> Package...
输入项目名,点击create
Xcode 自动帮我们生成了配置文件和源码目录:
2.2 编写风们的SPM库
-
Logger.swift
代码如下:
public struct Logger {
var DEBUG: Bool = false
/*
这里是 struct,所以按照 swift 的 struct 语法,可以不写 init,
但是,因为是封装成 SPM 库,需要对外暴露,
所以 init 构造器不能默认不写,一定需要有 public 构造器,否则外部无法初始化
*/
public init() {
}
public init(_ debug: Bool) {
self.DEBUG = debug
}
public func log(_ msg: String) {
if DEBUG {
debugPrint("Logger: \(msg)")
}
}
}
- 修改测试用例
LoggerTests.swift
,不然会报错:
import XCTest
@testable import Logger
final class LoggerTests: XCTestCase {
func testExample() throws {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct
// results.
Logger(true).log("hhm")
}
static var allTests = [
("testExample", testExample),
]
}
然后command+B
编译就能成功了
2.3 本地集成SPM库
1.关闭SPM Xcode工程
2.打开需要集成SPM的项目工程
-
添加本地SPM库
- 点击
+
号
- 点击
Add Local...
,选择我们自己的本地SPM项目,添加到项目中
3.添加framework链接,如图:
- 点击
+
号,选择如下:
- 点击
Add
即可
- 代码测试
import Logger
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
Logger(true).log("test log")
}
}
输出结果:
2.4 上传至Github
- 我是使用
Github desktop
工具上传的,自行百度,这里不复述了。 - 重新集成
- 移除之前添加本地的SPM文件(2.3第2步)
- 移除手动添加的framework(2.3第3步)
-
集成SPM包,完成