使用 SPM 安裝第三方套件 — 以抓圖套件 Kingfisher 為例

開發 iOS App 時,我們有許多管理安裝第三方套件的方法,其中最為人熟知的三大套件管理天王為 SPM(Swift Package Manager),CocoaPods & Carthage。

Xcode 本身內建的是 SPM,透過它我們不用額外安裝管理工具就能安裝第三方套件。以下我們一步步介紹如何使用 SPM 安裝第三方套件。

使用 SPM 加入套件

我們以知名的網路功能套件 Kingfisher 為例,從 Xcode 利用 SPM 將它加入吧。

1 打開 Add Packages 視窗

  • 方法 1。

從 Quick Actions(cmd+shift+a)點選 Add Package Dependencies。

  • 方法 2。

點選 File > Add Package Dependencies。

  • 方法 3。

點選專案檔,選擇 Project 下的專案,然後切換到 Swift Packages 頁面。

點選左下角的 + 加入套件(package)。

2 複製 Kingfisher 的 GitHub 網址,將它輸入在 Search or Enter Package URL 的框框裡。

https://github.com/onevcat/Kingfisher

找到 Kingfisher 後,我們可從 Dependency Rule 指定想要的套件版本,branch 或 commit。

點選 Add Package,Xcode 將開始抓取相關的套件。

經過小小的等待,Xcode 將顯示它抓到的套件,勾選它後點選 Add Package,將套件加到專案裡。

套件完成安裝後,Swift Packages 下的套件列表將出現 Kingfisher 的相關資訊。

Project navigator 也會多出 Swift Package Dependencies 的區塊,在它底下顯示目前安裝的 Kingfisher 套件。

ps: 覺得輸入套件網址有點麻煩的朋友,也可以利用利用 SPM 搜尋 & 列出 GitHub 上收藏的套件。

3 在程式裡使用 Kingfisher。

套件成功安裝後,現在我們已經可以在專案的程式裡自由地撰寫Kingfisher 的相關程式了。

  • SwiftUI App
import SwiftUI
import Kingfisher

struct ContentView: View {
var body: some View {
let url = URL(string: "https://img.ruten.com.tw/s2/d/25/0a/22030927802634_864.jpg")
return KFImage(url)
.resizable()
.scaledToFit()
}
}
  • UIKit App
import UIKit
import Kingfisher

class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "https://img.ruten.com.tw/s2/d/25/0a/22030927802634_864.jpg")
imageView.kf.setImage(with: url)
}
}

將 SPM package 的 library 加到專案

一個 package 裡可能包含多個 library,假設我們原本只加入 packgae 裡的某個 library,之後可再加入其它的 library。

套件更新

之後若想更新套件,可從 Xcode 的 menu 點選 File > Packages > Update to Latest Package Versions。

SPM 套件搜尋網站

要去哪兒找 SPM 套件呢 ? 感謝以下網站幫我們整理了支援 SPM 的套件,有興趣的朋友可透過以下連結查詢。

解決 SPM 的套件版本問題

從 Dependency Rule 指定套件版本

如上圖所示,它將抓取 7.0.0 到 8.0.0 的 Kingfisher,Up to Next Major 7.0.0 < 8.0.0 表示未來 Kingfisher 改版時,我們最多升級到 7.9.x,但不會到 8.x.x。版本的第一個數字代表 major,Up to Next Major 表示我們不想冒險採用 Major 改動的版本,因為 Major 改動是大改版,一般會大幅影響專案裡原本的程式。

除了 Up to Next Major Version,我們也可以選擇其它的設定。

比方選擇 Up to Next Minor 表示只考慮更新第三個數字改動的版本,因此如下圖所示,未來 Kingfisher 改版時,我們最多升級到 7.0.x ,但不會到 7.1.x。版本的第二個數字代表 minor,Up to Next Minor 表示我們不想冒險採用 Minor 改動的版本,

如果想指定某個版本,則可選擇 Excat,然後輸入版號。

套件有哪些版本可從 GitHub 專案頁面的 Tags 查詢。

剛剛提到版本條件將影響我們可安裝的套件版本,因此有時就算我們點選 Update to Latest Package Versions,依然無法升級到最新版本,比方以下例子:

假設我們安裝了動畫 Hero 套件,指定它的版本是 Up to Next Minor 1.3.0 < 1.4.0。

此時安裝的將是 1.3 開頭的最新版,1.3.1。

倘若我們接著點選 Update to Latest Package Versions,它並不會升級到 Hero 的最新版 1.4.0,因為 Up to Next Minor 造成我們只能升級到 1.3.x。

不過既然當初規則是我們定的,我們當然也可以修改。步驟如下:

1 雙擊 Packages 表單裡想修改 Version Rule 的套件。

2 將數字從 1.3.0 改成 1.4.0。

接著神奇的事發生了 ! 專案裡安裝的 Hero 套件將自動更新,升級到 1.4.0。

將搭配 SPM 套件的專案上傳到 GitHub

當我們將搭配 SPM 套件的專案上傳到 GitHub,有幾個值得注意的小地方。

  • 它並不會將套件上傳,只會上傳我們 Xcode 專案裡的檔案。

因此就算我們裝了十幾個套件,也不用擔心 GitHub 上的 repository 會變得很大。

之後當我們的隊友點選 GitHub 專案網頁上的 Open in Xcode,將它 clone 下來時,一開始是不包含套件的。

不過別著急,從 Xcode 打開專案後,可看到 Swift Package Dependencies 下的套件 hero 正在 fetching(取得中),只要稍等片刻,即可看到 1.4.0 的 Hero 套件。

  • 建議將 swiftpm 加入 git 版本管理。

因為它裡頭的 Package.resolved 包含安裝的套件版本資訊,它可以幫助確保團隊的成員都採用同一個版本的套件。

參考資源

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com