使用Swift Package Manager (SPM)实现xcframework分发

news/2024/10/18 3:29:23/

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器,用于解决在开发过程中管理和构建包依赖项的需求。

1、上传xcframework.zip到服务端

压缩xcframeworks成一个zip包,并且上传到服务器,得到一个压缩包的https链接,如:https://www.xxx.com/mysdk.xcframework.zip

在命令行中运行

shasum -a 256 mysdk.xcframework.zip

得到这个压缩包的SHA256哈希值

2、制作package

使用下面命令初始化package:

swift package init --type library

或者在Xcode菜单选择 File -> New -> Package 新建package

2.1、Package结构

一个 Package(包)由 Swift 源码文件和一个清单文件组成。这个清单文件被命名为 Package.swift,它使用 PackageDescription 模块来定义包的名称、内容以及依赖关系。

Package包含如下内容:

  • Package.swift: 包的清单文件,用于描述包的名称、内容、依赖关系、支持的 Swift 版本号;
  • Sources: 源码文件夹,通常包括 C/C++ 代码和 Swift 代码等;
  • Tests: 单元测试代码

目录结构如下:

Sources
--MyLibrary     //同顶层目录名的target目录
-----MyLibrary.swift

Tests           //单元测试
--MyLibraryTests
-----MyLibraryTests.swift
README.md       //文档  
Package.swift   //配置文件,类似Cocoapods自定义pod库的podspec文件 

2.2、修改package.swift文件

// swift-tools-version:5.8 //这句不可以删除,指定版本的import PackageDescriptionlet 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

2.2.1、添加对另一个Swift Package的依赖项

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)

2.2.2、明确声明资源

要添加Xcode无法自动处理的资源,需要在package.swift中明确声明为资源。

targets: [.target(name: "MyLibrary",resources: [.process("text.txt")]),
]

当明确声明资源时,必须选择以下规则之一,以确定Xcode如何处理资源文件:

  • .process

Xcode会为支持此类优化的平台优化图像文件。如果资源没有特殊处理,Xcode会将资源复制到资源包的顶级目录。

  • .copy

Xcode会将资源原样复制到资源包的顶层。保留目录的结构。

2.2.3、排除资源

如果文件驻留在target文件夹中,并且不希望它成为软件包资源,需要将其传递给exclude参数,来从target中排除文件:

targets: [.target(name: "MyLibrary",exclude:["instructions.md"]),
]

2.2.3、binaryTarget

创建一个引用本地库的二进制target

.binaryTarget(name: "MySDK", // 二进制库的名称path: "", // 二进制库的路径
),

创建一个引用远程库的二进制target。

.binaryTarget(name: "MySDK", // 二进制库的名称url: "", // 二进制库的下载链接checksum: "" // 二进制库的校验和
),

2.2.4、LinkerSettings

声明与系统框架的连接:

linkerSettings: [.linkedFramework("SystemConfiguration")
]

声明与系统库的连接:

linkerSettings: [.linkedLibrary("z"),.linkedLibrary("sqlite3"),
]

2.3、上传package到git

上传文件夹到git公开仓库,并且打上tag版本号。

3、使用package包

打开Xcode,选择file -> add Packages,将git路径粘贴到输入框。


http://www.ppmy.cn/news/1279116.html

相关文章

开源 AI 新秀崛起:Bittensor 更像是真正的“OpenAI”

强大的人工智能正在飞速发展&#xff0c;而完全由 OpenAI、Midjourney、Google&#xff08;Bard&#xff09;这样的少数公司控制 AI 不免让人感到担忧。在这样的背景下&#xff0c;试图用创新性解决方案处理人工智能中心化问题、权力集中于少数公司的 Bittensor&#xff0c;可谓…

macOS 开发 - MASShortcut

文章目录 关于 MASShortcut项目结构 快速使用源码学习检测是否有热键冲突处理 Event macOS 开发交流 秋秋群&#xff1a;644096295&#xff0c;V : ez-code 关于 MASShortcut MASShortcut 是一款快捷键管理工具&#xff0c;替代和兼容 ShortcutRecorder github : https://git…

2023 英特尔On技术创新大会直播 |AI科技创新的引路者

英特尔大会 前言英特尔人工智能英特尔创新技术基于英特尔架构的科学计算总结 前言 英特尔技术创新大会是一个令人激动和启发的盛会。在这次大会上&#xff0c;我有幸观看了许多令人瞩目的科技创新和前沿技术的展示。这些展示不仅展示了英特尔作为科技巨头的实力&#xff0c;更…

单调栈分类、封装和总结

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 通过枚举最小&#xff08;最大&#xff09;值不重复、不遗漏枚举所有子数组 C算法&#xff1a;美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right&#xff0c;[left,right]直接的高度都是maxHeight[i] 可以…

Mac电脑上soucetree账户更改

在开发公司项目的时候遇到一个问题。soucetree提示需要输入已离职员工-张三的密码。 问题&#xff1a;Mac电脑使用souetree&#xff0c;拉取仓库代码提示需要输入其他员工密码。 解决&#xff1a; Mac电脑 SourceTree去掉之前的账户 1、前往文件路径 /Library/Application Su…

RocketMQ的Docker镜像部署(以及Dashboard的部署、ACL配置)

RocketMQ的Docker镜像部署&#xff08;以及Dashboard、ACL&#xff09; 准备 包含RocketMQ部署&#xff08;NameServer、Broker&#xff09;、Dashboard、ACL拉取镜像 RocketMQ$ docker pull apache/rocketmq:5.1.4Dashboard$ docker pull apacherocketmq/rocketmq-dashboard…

c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

目录 Stack容器 一、Stack容器介绍 二、stack常用接口 三、栈的示例 queue&#xff08;队列&#xff09;容器 一、queue容器介绍 二、queue常用接口 三、queue示例 list容器 一、list容器介绍 二、list常用接口及示例 &#xff08;一&#xff09;list构造函数 &am…

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时&#xff0c;动态变化时无法及时刷新更新适配界面的问题 目录 Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时&#xff0c;动态变化时无法及时刷新更新适配界面的问题 一、简单介绍…