Enjoy Your Coding

使用 Swift Package Manager 管理套件

這篇文章將介紹開發iOS應用程式時,如何搭配Swift Package Manager做相依性套件管理。以往大部分開發者都是使用Cocoapods當作套件管理工具。由於我也有在寫.NET、Python跟Node.js,這三個程式語言也有提供官方的套件管理工具,我自己剛開始買書跟Udemy的iOS課程自學的時候,也有想過如何做套件管理相關。

目前實驗過的幾個Swift可以套件管理的方法:

  • Swift Package Manager (官方)
  • Cocoapods (社群)
  • 使用Git Submodule 下載套件,手動設定至專案

使用過這幾種方法後,在不同的練習中做使用,網路上應該也有許多Cocoapods的文章了,所以我決定撰寫使用Swift Package Manager的版本,個人比較傾向Swift Package Manager做管理(畢竟是官方支援的),初始化與修改套件的操作部分跟Cocoapods幾乎一樣,初始化、設定專案、新增套件、下載套件等步驟。

為什麼我們需要套件管理工具呢? 套件管理工具幫我們下載套件、管理套件,那為何我們不手動下載就好?個人對套件管理工具有一些使用習慣:

  • 不隨意更改套件程式碼,若有需要則會依照License另外Fork回自己的GitHub做修改使用
  • 不將套件加入版本控管系統,套件可能會很龐大,佔用空間,而且變動可能性又很低,通常需要更新的話,我們都會將設定檔裡的該套件改成新的版本後再下載。
  • 若需使用套件,一定使用套件管理工具,希望能做到自己撰寫的程式碼與套件的目錄分隔,也希望在多人開發時,可以在設定與管理方便更有效率。

我覺得套件管理的好處就是我們可以幫助我們快速下載我們需要的套件,並與專案立即做結合,也可以搭配不同版本即時切換做測試。

使用的步驟說明如下:

新增 Swift iOS 專案

若已有專案,可省略此步驟。

新增 iOS 專案

點選Create a new Xcode project後,選iOS的Single View Application後按下Next alt text 輸入Project Name後,語言選Swift,按下Next後選擇路徑,新增專案完成。 alt text

使用 Swift Package Manager

以下的指令我們使用Terminal進行操作,以下將套件管理的專案命名為Library

初始化設定

開啟Terminal,切換至Xcode專案的目錄,新增資料夾Library後,切換進入Library,然後初始化設定。

$ cd <Xcode Project Path>
$ mkdir Library
$ cd Library
$ swift package init --type library

初始化後,會出現了相關檔案,如下所示

.
├── .gitignore
├── Package.swift
├── Sources
│   └── Library.swift
└── Tests
    ├── LibraryTests
    │   └── LibraryTests.swift
    └── LinuxMain.swift
加入套件

這時候可以去Cocoapods網站上找自己專案中需要使用的套件,在本文章以Alamofire作為例子,開啟Package.swift後,改成以下內容:

import PackageDescription

let package = Package(
    name: "Library",
    dependencies: [
        .Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4, minor: 5)
    ]
)

其中majorVersion搭配minor出來的意思是Alamofire 4.5.0,更進階的套件版本語法可參考https://medium.com/swift-programming/swift-package-manger-version-syntax-f3a5c053a613

下載套件

使用Terminal在剛剛的Library目錄下,輸入以下指令

$ swift package fetch

輸入後,會將套件下載至本地

Fetching https://github.com/Alamofire/Alamofire.git
Cloning https://github.com/Alamofire/Alamofire.git
Resolving https://github.com/Alamofire/Alamofire.git at 4.5.0

這時候的檔案目錄多了.build的隱藏資料夾,包含了Alamofire的Git專案。

產生 Xcode 專案

下載第一個套件後,接下來透過指令來產生Xcode專案設定檔,以便整合至現有專案。

$ swift package generate-xcodeproj

出來後的專案設定檔為Library.xcodeproj

現有專案結合Swift Package Manager的專案

使用Xcode開啟現有專案,點選File->Add Files to "現有專案",點選剛剛產生的Library.xcodeproj

或者從Finder中手動拖曳Library.xcodeproj現有專案裡,如下圖: alt text

再來,透過左邊的專案總管,點選專案檔,新增Workspace下得Library.frameworkLinked Frameworks and Libraries後。 alt text

接著就可以直接import Alamofire使用了,若出現錯誤找不到套件,基本上先Build後,就不會出現錯誤了。

加入新的套件

第一次設定完後,之後加入新的套件只需要設定Package.swift後,下載套件(swift package fetch)、重新產生Xcode專案(swift package generate-xcodeproj)後即可使用,一定要下重新產生Xcode專案的指令喔! 接著就可以直接import SwiftyJSON使用了,若出現錯誤找不到套件,基本上先Build後,就不會出現錯誤了。

多人合作注意事項

在其他電腦下git pullgit clone <專案>後要先下載套件(swift package fetch)、重新產生Xcode專案(swift package generate-xcodeproj)!