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

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

原本 CocoaPods 應該是其中最多人採用的,不過在 Xcode 11,一下子風雲變色,排名即將大搬風了。因為現在 Xcode 11 內建支援 SPM !

使用 SPM 加入套件

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

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

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

3 複製 Kingfisher 的 GitHub 網址,將它輸入在 Search or enter package repository URL 的框框裡。

https://github.com/onevcat/Kingfisher

找到 Kingfisher 後,我們可指定想要的套件版本,branch 或 commit,預設將採用我們最常用的設定,Up to Next Major Version。

如上圖所示,它將抓取 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 查詢。

接著點選 Add Package,即可完成套件的安裝。

ps: 若是安裝時出現以下錯誤,可先將 Up to Next Major Version 改成 6.0.0。

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

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

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

4 在程式裡使用 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()
// Do any additional setup after loading the view.
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。

剛剛提到版本條件將影響我們可安裝的套件版本,因此有時就算我們點選 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 包含安裝的套件版本資訊,它可以幫助確保團隊的成員都採用同一個版本的套件。

SPM 套件搜尋網站

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

解決 SPM 的套件版本問題

參考資源

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

彼得潘和學生們在開發 iOS App 路上曾經解決的問題集

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

彼得潘和學生們在開發 iOS App 路上曾經解決的問題集

彼得潘的 iOS App Neverland

Written by

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

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

彼得潘和學生們在開發 iOS App 路上曾經解決的問題集