Swift Package Manager - 教你如何让自己的库支持SPM依赖

@[toc]

前言

系列目录

  1. Swift Package Manager - 基础篇(教你 iOS 项目, 如何用 SPM 依赖第三方)
  2. Swift Package Manager - 教你如何让自己的库支持SPM依赖

上一篇 已经写了如何让自己的项目, 通过 SPM 依赖第三方.
那现在有个问题, 自己如何去创建一个支持 Swift Package 的库呢? 那么接下来, 我们就来探索如何把自己的库支持 SPM 吧! 💪

创建 Swift Package 库

和以往一样, 一步一步来!

初始化 Swift Package 项目

命令行初始化

创建 XQPackageTest 文件夹, 然后打开终端 cd 到该文件夹下, 输入

swift package init    

然后控制台显示如下
那么就表示, 当前已经初始化好一个最基础的库了

Creating library package: XQPackageTest
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/XQPackageTest/XQPackageTest.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/XQPackageTestTests/
Creating Tests/XQPackageTestTests/XQPackageTestTests.swift
Creating Tests/XQPackageTestTests/XCTestManifests.swift

文件目录如下 ( .gi 是我后面自己加上的 )


在这里插入图片描述

里面的文件, 其实我们要关心的, 一般就两个

  • Package.swift: 是描述库的一些配置, 属性等等, 可以当做 CocoaPods 的 xxx.podspec 文件. (这个后面再详细描述, 现在默认配置就行)
  • Source/xxx 文件夹: 放源码的文件夹, 我们直接把源码扔到这个文件夹下就可以了

使用 Xcode 初始化

当然,Xcode 也提供了创建 Swift Package 入口, 如下图

在这里插入图片描述

编写库代码

这里就直接拿系统生成的 XQPackageTest.swift 更改一下代码, 方便依赖成功后, 测试一下是否真的成功了。

在这里插入图片描述

然后 command + build 一下, 看看是否正确.
报错了, 这个时候看一下报错.

在这里插入图片描述

其实就是因为我们修改了代码, 导致 Test 模块运行不了( Build 会运行 Test 模块 )
这个时候, 我们可以选择把这行代码注释掉, 或者修改成正确代码就可以了, 如下

在这里插入图片描述

上传库到云端

修改好后, 上传库到云端(github, gitee 或者其他托管服务器都行), 我这边上传到我本地 gitlab 服务器.

在这里插入图片描述

项目进行依赖

打开你一个 iOS 或者 Mac 项目都行, 然后进行添加依赖, 操作和 上一篇 一样, 只需要把第三方的 链接 替换为你自己库的 链接 就可以了

不过这里要注意一下, 如果你不想发 Release 版本(偷懒), 就直接选择 Branch, 或者 Commit 就行.
比如我当前没创建 Release 版本, 直接进行依赖的话, 就会出现以下错误

The package dependency graph can not be resolved; unable find any available tag for the following requirements:
在这里插入图片描述

这个时候, 我们只需要把 Version 改为 Branch 或者 Commit 就行了.
例如我这里选择 Branch, 并输入 master 分支, 这样就能点击 Next 了.

在这里插入图片描述

依赖成功

成功之后, 就能看到, 自己的库已经在列表中了

在这里插入图片描述

测试依赖

测试一下库的接口, 如下图

在这里插入图片描述

是的, 至此, 已经完成依赖了. ✌️

库中, 依赖别的第三方

这个只要在库里的 Package.swift 文件, 添加依赖就行了. 如下

import PackageDescription

let package = Package(
    name: "XQPackageTest",
    platforms: [
        .iOS(.v10),
    ],
    products: [
        .library(
            name: "XQPackageTest",
            targets: ["XQPackageTest"]),
    ],
    
    /// 依赖那些第三方
    dependencies: [
        .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(5, 0, 1)),
    ],
    
    targets: [
        .target(
            name: "XQPackageTest",
            dependencies: [
                // 你依赖的第三方
                "SnapKit",
        ]),
        .testTarget( name: "XQPackageTestTests", dependencies: ["XQPackageTest"]),
        
    ],
)

Package.swift 简介

上面说过, Package.swift 是相当于 CocoaPods 中的 xxx.podspec 文件
那么我这里就简单介绍一下里面的一些属性

import PackageDescription

let package = Package(
    
    name: "XQPackageTest",
    
    /// 支持平台多少版本以上
    platforms: [
        .iOS(.v10),
//        .macOS(.v10_12),
//        .tvOS(.v10),
//        .watchOS()
    ],
    
    /// 该库的一些配置
    products: [
        .library(
            name: "XQPackageTest",
            // 动态库 or 静态库
            // 默认为 静态库
            type: .static,
            targets: ["XQPackageTest"]),
    ],
    
    /// 依赖那些第三方
    dependencies: [
        
        // 第三方有良好的版本格式: 大版本.小版本.测试版本
        // 就可以直接用这个
        .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(5, 0, 1)),
        
        // 如果第三方版本格式, 是其他的, 例如 1.2, 根本没用第三位, 那么我们也可以这样, 直接传入字符串
        // .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(stringLiteral: "5.0.1")),
        
        // 如果第三方目前的 release 版本还没支持 SPM 的话, 我们可以直接指向他的 master 分支
        // .package(url: "https://github.com/SnapKit/SnapKit.git", Package.Dependency.Requirement.branch("master")),
        
        // 当然, 也能关联本地的能支持 SwiftPM 的库
        // .package(path: "../XQSwiftPMTest"),
    ],
    
    
    targets: [
        // 你库的 target
        .target(
            name: "XQPackageTest",
            dependencies: [
                // 你关联的第三方
                "SnapKit",
        ]),
        
        // 测试的 target
        .testTarget(
            name: "XQPackageTestTests",
            dependencies: ["XQPackageTest"]),
        
    ],
    
    // 库支持 Swift 语言版本
    swiftLanguageVersions: [
        .v5
    ]
)

SPM OC

目前, 据我了解, 还不能进行 Swift 和 OC 的混编.
但是能编写 OC 和 C 这些的库, 如下图

在这里插入图片描述

这里要注意一下, 系统默认是公开的 .h是 ==Sources/[targetName]/include== 路径下.
如果要修改为某个路径下的.h文件, 要自己重写 target 的 ==publicHeadersPath==.
publickHeadersPath 默认的路径是在 ==[Sources]/[targetName]== 下.

例如我要暴露整个库所有的 .h
那么如上图, publicHeadersPath 就为 "../XQPackageTest" 即可

待解决问题

目前还有几个问题待解决, 后续解决了的话, 也会马上更新文章。
当然,如有大佬已经解决了以下问题,请评论或者私信我, 因为我也想知道如何解决 o(╥﹏╥)o

  • 如何直接关联本地代码, 就是不用上传到云端的. 类似 CocoaPods 直接 :path => '' 指向本地
  • 关联 lib 库
  • 关联 framework 库
  • 添加资源文件, 如 .xib, .storyboard, .png, .html, .xcassets, .json, .zip 等等

Authentication failed

选择更新 SPM 库的时候, 偶尔会报错, 如下

==x-swift-package-repository-authentication://?scm=com.apple.dt.Xcode.sourcecontrol.Git&url=xxx#error=-1005 Authentication failed because the credentials were missing==

在这里插入图片描述

因为有些库是私有库, 需要账号密码, 或者一些其他验证登录.
如果像账号密码登录, 那么过了一定时间, 就会验证失效. 需要重新输入账号密码.
这时候双击图中, 蓝色选中的这个错误, 系统会弹出一个输入框.

在这里插入图片描述

这个时候, 只要输入账号密码, 点击 OK 即可.

库不会更新到最新

修改完自己的库, 提交上去, 偶尔会出现无法下拉最新代码.
这时候选中 File -> Swift Packages -> Reset Package Caches, 如下图.

在这里插入图片描述

如还没有, 那么尝试关闭 Xcode,或点击 Update tolatest Package Versions 操作.

如还是没有的话...那么 Show Find 你的库, 进入到项目的编译缓存文件夹, 删除这个项目的编译缓存
路径如这样 ==~/Library/Developer/Xcode/DerivedData/你项目的名称-随机码==

一般进行以上操作都是可以的了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容