Swift Package Manager - 教你如何讓自己的庫(kù)支持SPM依賴(lài)

@[toc]

前言

系列目錄

  1. Swift Package Manager - 基礎(chǔ)篇(教你 iOS 項(xiàng)目, 如何用 SPM 依賴(lài)第三方)
  2. Swift Package Manager - 教你如何讓自己的庫(kù)支持SPM依賴(lài)

上一篇 已經(jīng)寫(xiě)了如何讓自己的項(xiàng)目, 通過(guò) SPM 依賴(lài)第三方.
那現(xiàn)在有個(gè)問(wèn)題, 自己如何去創(chuàng)建一個(gè)支持 Swift Package 的庫(kù)呢? 那么接下來(lái), 我們就來(lái)探索如何把自己的庫(kù)支持 SPM 吧! ??

創(chuàng)建 Swift Package 庫(kù)

和以往一樣, 一步一步來(lái)!

初始化 Swift Package 項(xiàng)目

命令行初始化

創(chuàng)建 XQPackageTest 文件夾, 然后打開(kāi)終端 cd 到該文件夾下, 輸入

swift package init    

然后控制臺(tái)顯示如下
那么就表示, 當(dāng)前已經(jīng)初始化好一個(gè)最基礎(chǔ)的庫(kù)了

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 是我后面自己加上的 )


在這里插入圖片描述

里面的文件, 其實(shí)我們要關(guān)心的, 一般就兩個(gè)

  • Package.swift: 是描述庫(kù)的一些配置, 屬性等等, 可以當(dāng)做 CocoaPods 的 xxx.podspec 文件. (這個(gè)后面再詳細(xì)描述, 現(xiàn)在默認(rèn)配置就行)
  • Source/xxx 文件夾: 放源碼的文件夾, 我們直接把源碼扔到這個(gè)文件夾下就可以了

使用 Xcode 初始化

當(dāng)然,Xcode 也提供了創(chuàng)建 Swift Package 入口, 如下圖

在這里插入圖片描述

編寫(xiě)庫(kù)代碼

這里就直接拿系統(tǒng)生成的 XQPackageTest.swift 更改一下代碼, 方便依賴(lài)成功后, 測(cè)試一下是否真的成功了把敞。

在這里插入圖片描述

然后 command + build 一下, 看看是否正確.
報(bào)錯(cuò)了, 這個(gè)時(shí)候看一下報(bào)錯(cuò).

在這里插入圖片描述

其實(shí)就是因?yàn)槲覀冃薷牧舜a, 導(dǎo)致 Test 模塊運(yùn)行不了( Build 會(huì)運(yùn)行 Test 模塊 )
這個(gè)時(shí)候, 我們可以選擇把這行代碼注釋掉, 或者修改成正確代碼就可以了, 如下

在這里插入圖片描述

上傳庫(kù)到云端

修改好后, 上傳庫(kù)到云端(github, gitee 或者其他托管服務(wù)器都行), 我這邊上傳到我本地 gitlab 服務(wù)器.

在這里插入圖片描述

項(xiàng)目進(jìn)行依賴(lài)

打開(kāi)你一個(gè) iOS 或者 Mac 項(xiàng)目都行, 然后進(jìn)行添加依賴(lài), 操作和 上一篇 一樣, 只需要把第三方的 鏈接 替換為你自己庫(kù)的 鏈接 就可以了

不過(guò)這里要注意一下, 如果你不想發(fā) Release 版本(偷懶), 就直接選擇 Branch, 或者 Commit 就行.
比如我當(dāng)前沒(méi)創(chuàng)建 Release 版本, 直接進(jìn)行依賴(lài)的話(huà), 就會(huì)出現(xiàn)以下錯(cuò)誤

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

這個(gè)時(shí)候, 我們只需要把 Version 改為 Branch 或者 Commit 就行了.
例如我這里選擇 Branch, 并輸入 master 分支, 這樣就能點(diǎn)擊 Next 了.

在這里插入圖片描述

依賴(lài)成功

成功之后, 就能看到, 自己的庫(kù)已經(jīng)在列表中了

在這里插入圖片描述

測(cè)試依賴(lài)

測(cè)試一下庫(kù)的接口, 如下圖

在這里插入圖片描述

是的, 至此, 已經(jīng)完成依賴(lài)了. ??

庫(kù)中, 依賴(lài)別的第三方

這個(gè)只要在庫(kù)里的 Package.swift 文件, 添加依賴(lài)就行了. 如下

import PackageDescription

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

Package.swift 簡(jiǎn)介

上面說(shuō)過(guò), Package.swift 是相當(dāng)于 CocoaPods 中的 xxx.podspec 文件
那么我這里就簡(jiǎn)單介紹一下里面的一些屬性

import PackageDescription

let package = Package(
    
    name: "XQPackageTest",
    
    /// 支持平臺(tái)多少版本以上
    platforms: [
        .iOS(.v10),
//        .macOS(.v10_12),
//        .tvOS(.v10),
//        .watchOS()
    ],
    
    /// 該庫(kù)的一些配置
    products: [
        .library(
            name: "XQPackageTest",
            // 動(dòng)態(tài)庫(kù) or 靜態(tài)庫(kù)
            // 默認(rèn)為 靜態(tài)庫(kù)
            type: .static,
            targets: ["XQPackageTest"]),
    ],
    
    /// 依賴(lài)那些第三方
    dependencies: [
        
        // 第三方有良好的版本格式: 大版本.小版本.測(cè)試版本
        // 就可以直接用這個(gè)
        .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(5, 0, 1)),
        
        // 如果第三方版本格式, 是其他的, 例如 1.2, 根本沒(méi)用第三位, 那么我們也可以這樣, 直接傳入字符串
        // .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(stringLiteral: "5.0.1")),
        
        // 如果第三方目前的 release 版本還沒(méi)支持 SPM 的話(huà), 我們可以直接指向他的 master 分支
        // .package(url: "https://github.com/SnapKit/SnapKit.git", Package.Dependency.Requirement.branch("master")),
        
        // 當(dāng)然, 也能關(guān)聯(lián)本地的能支持 SwiftPM 的庫(kù)
        // .package(path: "../XQSwiftPMTest"),
    ],
    
    
    targets: [
        // 你庫(kù)的 target
        .target(
            name: "XQPackageTest",
            dependencies: [
                // 你關(guān)聯(lián)的第三方
                "SnapKit",
        ]),
        
        // 測(cè)試的 target
        .testTarget(
            name: "XQPackageTestTests",
            dependencies: ["XQPackageTest"]),
        
    ],
    
    // 庫(kù)支持 Swift 語(yǔ)言版本
    swiftLanguageVersions: [
        .v5
    ]
)

SPM OC

目前, 據(jù)我了解, 還不能進(jìn)行 Swift 和 OC 的混編.
但是能編寫(xiě) OC 和 C 這些的庫(kù), 如下圖

在這里插入圖片描述

這里要注意一下, 系統(tǒng)默認(rèn)是公開(kāi)的 .h是 ==Sources/[targetName]/include== 路徑下.
如果要修改為某個(gè)路徑下的.h文件, 要自己重寫(xiě) target 的 ==publicHeadersPath==.
publickHeadersPath 默認(rèn)的路徑是在 ==[Sources]/[targetName]== 下.

例如我要暴露整個(gè)庫(kù)所有的 .h
那么如上圖, publicHeadersPath 就為 "../XQPackageTest" 即可

待解決問(wèn)題

目前還有幾個(gè)問(wèn)題待解決, 后續(xù)解決了的話(huà), 也會(huì)馬上更新文章。
當(dāng)然壤蚜,如有大佬已經(jīng)解決了以下問(wèn)題邻悬,請(qǐng)?jiān)u論或者私信我, 因?yàn)槲乙蚕胫廊绾谓鉀Q o(╥﹏╥)o

  • 如何直接關(guān)聯(lián)本地代碼, 就是不用上傳到云端的. 類(lèi)似 CocoaPods 直接 :path => '' 指向本地
  • 關(guān)聯(lián) lib 庫(kù)
  • 關(guān)聯(lián) framework 庫(kù)
  • 添加資源文件, 如 .xib, .storyboard, .png, .html, .xcassets, .json, .zip 等等

Authentication failed

選擇更新 SPM 庫(kù)的時(shí)候, 偶爾會(huì)報(bào)錯(cuò), 如下

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

在這里插入圖片描述

因?yàn)橛行?kù)是私有庫(kù), 需要賬號(hào)密碼, 或者一些其他驗(yàn)證登錄.
如果像賬號(hào)密碼登錄, 那么過(guò)了一定時(shí)間, 就會(huì)驗(yàn)證失效. 需要重新輸入賬號(hào)密碼.
這時(shí)候雙擊圖中, 藍(lán)色選中的這個(gè)錯(cuò)誤, 系統(tǒng)會(huì)彈出一個(gè)輸入框.

在這里插入圖片描述

這個(gè)時(shí)候, 只要輸入賬號(hào)密碼, 點(diǎn)擊 OK 即可.

庫(kù)不會(huì)更新到最新

修改完自己的庫(kù), 提交上去, 偶爾會(huì)出現(xiàn)無(wú)法下拉最新代碼.
這時(shí)候選中 File -> Swift Packages -> Reset Package Caches, 如下圖.

在這里插入圖片描述

如還沒(méi)有, 那么嘗試關(guān)閉 Xcode撞蚕,或點(diǎn)擊 Update tolatest Package Versions 操作.

如還是沒(méi)有的話(huà)...那么 Show Find 你的庫(kù), 進(jìn)入到項(xiàng)目的編譯緩存文件夾, 刪除這個(gè)項(xiàng)目的編譯緩存
路徑如這樣 ==~/Library/Developer/Xcode/DerivedData/你項(xiàng)目的名稱(chēng)-隨機(jī)碼==

一般進(jìn)行以上操作都是可以的了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市顶吮,隨后出現(xiàn)的幾起案子社牲,更是在濱河造成了極大的恐慌,老刑警劉巖悴了,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膳沽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡让禀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)陨界,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巡揍,“玉大人,你說(shuō)我怎么就攤上這事菌瘪∪校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵俏扩,是天一觀的道長(zhǎng)糜工。 經(jīng)常有香客問(wèn)我,道長(zhǎng)录淡,這世上最難降的妖魔是什么捌木? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮嫉戚,結(jié)果婚禮上刨裆,老公的妹妹穿的比我還像新娘。我一直安慰自己彬檀,他們只是感情好帆啃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著窍帝,像睡著了一般努潘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坤学,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天疯坤,我揣著相機(jī)與錄音,去河邊找鬼拥峦。 笑死贴膘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的略号。 我是一名探鬼主播刑峡,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洋闽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了突梦?” 一聲冷哼從身側(cè)響起诫舅,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宫患,沒(méi)想到半個(gè)月后刊懈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娃闲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年虚汛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皇帮。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卷哩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出属拾,到底是詐尸還是另有隱情将谊,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布渐白,位于F島的核電站尊浓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纯衍。R本人自食惡果不足惜瞳腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一袍镀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦菲嘴、人聲如沸调鬓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至应结,卻和暖如春刨疼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹅龄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工揩慕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮休。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓迎卤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玷坠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜗搔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 系列目錄 Swift Package Manager - 基礎(chǔ)篇(教你 iOS 項(xiàng)目, 如何用 SPM 依賴(lài)...
    普通上班族老王閱讀 1,819評(píng)論 0 7
  • 寫(xiě)這篇文章的起因是劲藐,一位友人突然跑來(lái)問(wèn)我:你大學(xué)過(guò)得快樂(lè)嗎?我?guī)缀鯖](méi)有猶豫:快樂(lè)罢疗唷聘芜!她很悶悶不樂(lè):你不覺(jué)得初...
    七一驁閱讀 152評(píng)論 0 1
  • 一、自我反省: 1 不會(huì)寫(xiě)缝龄,怎么寫(xiě)汰现,不知道寫(xiě)什么。(打開(kāi)思維不要局限這句話(huà)叔壤,直接背下來(lái)記住——璋氏三問(wèn)瞎饲,三哥四字決...
    說(shuō)的魔術(shù)閱讀 235評(píng)論 0 0
  • 從前有一個(gè)叫化子每天出門(mén)乞討企软,他很想過(guò)正常人的生活,于是他總要乞討一些糧食積攢起來(lái)饭望。可是他積攢了好多年形庭,他的糧倉(cāng)還...
    Leeson1989閱讀 398評(píng)論 0 0
  • 今天沐瑤八個(gè)月七天铅辞,爸爸和奶奶帶她去打防疫針和體檢,抽血化驗(yàn)說(shuō)沐瑤貧血萨醒,該添加輔食了斟珊,回來(lái)翻看沐瑤的體檢表確實(shí)六個(gè)...
    _Sweet閱讀 255評(píng)論 1 1