@[toc]
前言
系列目錄
- Swift Package Manager - 基礎(chǔ)篇(教你 iOS 項(xiàng)目, 如何用 SPM 依賴(lài)第三方)
- 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)行以上操作都是可以的了