SPM(Swift Package Manager)开发及常见事项

SPM怎么使用的不再赘述,其优点是Cocoapods这样的远古产物难以望其项背的,而且最重要的是可二进制化、对xcproj项目无侵入,除了网络之外简直就是为团队开发的项目库依赖最好的管理工具,是时候抛弃繁杂低下的cocoapods了。

一:如何制作?

这里以使用为准,gui操作创建:

1 . 在Xcode顶部菜单选择如下图操作

2 . 填写或更改自己的库名称,这里为"MyLibrary"

3 . 这样就生成了一个壳子SPM。里面最重要的就是图中圈出的部分。

Package.swift是描述管理SPM的文件,也是放到github之类的远端仓库后让Xcode识别的依据。Source则是源码存放的地方,现在里面默认是一个结构体,我们可以把自己要做成库的代码放进去(别忘了open public 等之类的权限修饰语)。除此之外还有readme.md,Tests文件夹,由于国内很少有人关注这些文件故这里直接忽略(Tests文件夹内的测试代码删除下,不然自己的代码编译不过)。

其中Package.swift作为库的描述和配置文件很重要。在这里需要搞懂一个概念,就是一个spm不是只对应唯一一个库的,是可以对应多个。

swift 复制代码
package = spm
library = 某个库

所以不太恰当的说,spm = 多个库的集合。当然一个spm只对应一个可执行库是没问题的也是很常见的。

swift 复制代码
import PackageDescription

let package = Package(
    name: "MyKit", // 库名称
    products: [
   		 // spm生成的可执行库(下面的target)和文件,一个spm可对应多个(例如一个RxSwift就对应多个可执行库)
        .library(
            name: "MyKit", // 这俩一般默认相同即可
            targets: ["MyKit"]), // 这俩一般默认相同即可
    ],
    // 此spm库依赖的其它spm库地址,如没有依赖,dependencies可无
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "MyKit", // 可执行库名称,也即在Source文件夹下的代码文件夹名称
            dependencies: []   // 此可执行库依赖的其它库的名称,如没有依赖。可无        
            exclude: ["Info.plist"], // 此库的权限描述plist清单,需要的权限等等
            resources: [
                .process("XXX.bundle") // 此库的资源文件路径
            ]), // 此库的资源文件
        .testTarget( // 此库的测试文件,如没有测试用例,可以删除
            name: "MyKitTests",
            dependencies: ["MyKit"]),
    ]
)

二:如何发布?

如果是在国外,可以不受网络限制直接在Xcode操作就可以发布,但国内受网络限制要采取其他方法才能应对。

1 . 先在github建立一个远端仓库。

2 . 提交创建的spm文件,并将其推送到远端。

swift 复制代码
// 1.提交创建的spm文件或者更改的文件
git commit -m "first commit"
swift 复制代码
// 2.切换到主分支上
git branch -m main
swift 复制代码
// 3.设置远端仓库
git remote add origin https://github.com/xxx/GithubTest.git
swift 复制代码
// 4.推到远端仓库,并输入密码和token
git push -u origin main

在推送期间要科学上网,不然推不成功。

如果没有科学上网的工具怎么办?其实可以不用放到github上。既然github访问不了,那gitlab或者gitee总是可以正常访问的,这也是个解决办法。

那如果想用xcode操作怎么办?xcode网络走的不是系统代理,所以你用clash等工具设置全局代理是没用的,但是可以专门为Xcode设置访问代理,这样就访问更新正常了。

最后

spm还可引入oc / c / c++,至于二进制化或者静态库大家可以共同探讨,这方面的网上资料较少

相关推荐
传奇开心果编程11 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
打工仔折腾 AI14 小时前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战
传奇开心果编程16 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
茶底世界之下16 小时前
视频预览切换为何会闪回旧帧:用 generation + mode identity 管住异步回调
ios·swift
老李IT笔记18 小时前
从备份恢复会把管理状态带回来吗:iOS 27 之后答案变了|MDM.Plus
ios·智能手机
谢亮_vipxieliang19 小时前
Go 接口设计原则核心知识点
开发语言·ios·golang
黑妹天下第一乖19 小时前
第 10 讲:阿加犀 AidVoice 端侧语音交互与语音识别实战
图像处理·人工智能·数码相机·opencv·交互·语音识别·xcode
Hello_Pyhx1 天前
iPhoneMirror:把 iPhone 接入 Windows,先分清投屏与反控
windows·ios·iphone
茶底世界之下1 天前
类型擦除之后,Metal 滤镜组合为什么不能只执行一个 Filter?
ios·swift
传奇开心果编程1 天前
【SwiftUI提高练中学】第8课 网络层架构:拦截器、重试、缓存与离线优先
学习·macos·ui·ios·swiftui