Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器,用于解决在开发过程中管理和构建包依赖项的需求。
压缩xcframeworks成一个zip包,并且上传到服务器,得到一个压缩包的https链接,如:https://www.xxx.com/mysdk.xcframework.zip
在命令行中运行
shasum -a 256 mysdk.xcframework.zip
得到这个压缩包的SHA256哈希值
使用下面命令初始化package:
swift package init --type library
或者在Xcode菜单选择 File -> New -> Package 新建package
一个 Package(包)由 Swift 源码文件和一个清单文件组成。这个清单文件被命名为?Package.swift,它使用?PackageDescription?模块来定义包的名称、内容以及依赖关系。
Package包含如下内容:
目录结构如下:
Sources
--MyLibrary ? ? //同顶层目录名的target目录
-----MyLibrary.swiftTests ? ? ? ? ? //单元测试
--MyLibraryTests
-----MyLibraryTests.swift
README.md ? ? ? //文档 ?
Package.swift ? //配置文件,类似Cocoapods自定义pod库的podspec文件?
// swift-tools-version:5.8 //这句不可以删除,指定版本的
import PackageDescription
let package = Package(
name: "MyLibrary",
platforms: [
.iOS(.v13) // 适用的 iOS 版本
],
products: [
.library(
name: "MyLibrary",
targets: ["MyLibraryTarget"]
),
],
dependencies: [
.package(name: "MapboxMaps", url: "https://github.com/mapbox/mapbox-maps-ios.git", .exact("10.12.3")),
.package(name: "Python-iOS", url: "https://github.com/kewlbear/Python-iOS.git", from: "0.1.1-b"),
.package(name: "NumPy-iOS", url: "https://github.com/kewlbear/NumPy-iOS.git", .branch("main")),
],
targets: [
.binaryTarget(
name: "MySDK", // 二进制库的名称
url: "", // 二进制库的下载链接 上一步生成的
checksum: "" // 二进制库的校验和 上一步生成的
),
.target(
name: "MyLibraryTarget",
dependencies: ["MapboxMaps", "Python-iOS", "NumPy-iOS", "MySDK"],
),
resources: [.copy("MyLib.bundle")],//资源包
linkerSettings: [
.linkedLibrary("z"),
.linkedLibrary("bz2"),
.linkedLibrary("sqlite3"),
.linkedFramework("SystemConfiguration")
]
]
)
package.swift 必须以字符串“// swift-tools-version:
”开头,后面跟一个版本号,例如:
// swift-tools-version:5.3
dependencies: [
.package(url: "https://url/of/another/package.git", from: "1.0.0"),
.package(path: "path/to/a/local/package/", "1.0.0"..<"2.0.0")
],
// 向位于给定路径的package添加依赖
.package(name: String, path: String)
// 向位于给定路径的package添加依赖
.package(path: String)// 添加从特定最小版本开始的package依赖,直到下一个主要版本
.package(url: String, from: Version)// 添加从特定最小版本开始的package依赖,直到但不包括指定的最大版本
.package(url: String, Range<Version>)//?添加从特定最小版本开始的package依赖,直到并包括特定的最大版本
.package(url: String, ClosedRange<Version>)
// 添加给定分支需求的package依赖.package(url: String, branch: String)
// 添加给定修订要求的package依赖
.package(url: String, revision: String)// 添加使用确切版本要求的package依赖
.package(url: String, exact: Version)
要添加Xcode无法自动处理的资源,需要在package.swift中明确声明为资源。
targets: [
.target(
name: "MyLibrary",
resources: [
.process("text.txt")]
),
]
当明确声明资源时,必须选择以下规则之一,以确定Xcode如何处理资源文件:
Xcode会为支持此类优化的平台优化图像文件。如果资源没有特殊处理,Xcode会将资源复制到资源包的顶级目录。
Xcode会将资源原样复制到资源包的顶层。保留目录的结构。
如果文件驻留在target文件夹中,并且不希望它成为软件包资源,需要将其传递给exclude参数,来从target中排除文件:
targets: [
.target(
name: "MyLibrary",
exclude:["instructions.md"]
),
]
上传文件夹到git公开仓库,并且打上tag版本号。
打开Xcode,选择file -> add Packages,将git路径粘贴到输入框。