Swift 程式語言

Swift Package Manager 實用指南 讓你有效率地重複使用元件!

自 Xcode 11 起,Apple 已經把建立及管理 Swift Package 的功能整合進 Xcode 中(也就是Swift Package Manager),讓開發者得以快速並直接地處理這些過程。我們將從頭開始建立一個 Swift Package,讓你日後輕易又有效率地重複使用元件。
Swift Package Manager 實用指南 讓你有效率地重複使用元件!
Swift Package Manager 實用指南 讓你有效率地重複使用元件!
In: Swift 程式語言, Xcode

歡迎來到新的教學文章,我將會告訴你建立自己的 Swift packages 的實作方式。Swift Packages 包含了不同的程式碼,不管是能夠在專案內重複使用的、能分享給其他開發者的、及可以作為專案的相依套件 (dependency) 的。自 Xcode 11 起,Apple 已經把建立及管理 Swift Package 的功能整合進 Xcode 中(也就是Swift Package Manager),讓開發者得以快速並直接地處理這些過程。

Package 主要由兩個部分組成:第一個部分是原始程式碼,也是它的核心;而另一個部分就是名為 Package.swiftmanifest 檔案,這個檔案是 package 設定的地方。一個 package 可以與一個專案相依,也可以有自己的相依套件,也就是說它可以建基於其他的 package 上,而這些相依套件會記錄在 manifest 檔案中。此外,Swift Package 能夠存在於你的電腦、或是遠端平台上,像是 Github 上的版本庫 (Respository)。本地端的 Package 在整合進專案的時候仍可更動,因此可以有意或無意地對它進行修改。雖然在實作的時候,把本地端的 Package 添加到專案裡是很好的做法,不過如果只是使用的話,那麼遠端版本會是一個更安全而輕鬆的方法。直接來說,包含 Package 的公開版本庫也可以與其他開發者共享。

說到分享 Package,負責發佈 Package 的是:Swift Package Manager 工具。根據官方文件:

The Swift Package Manager is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies.
(Swift Package Manager 是用來管理 Swift Code 發佈的工具。Apple 將它整合到了 Swift build system 內來自動化整個下載、編譯、及連結相依套件的過程。)

它是一個背後執行的程式,可以獲取及分享 Swift Package。這並不是 Xcode 11 的新功能,之前它是命令提示字元工具 (Command Line Tool)。但自 Xcode 11 開始,Swift Package Manager 就被整合進了 Xcode 裡,讓開發者處理 Package 時更加容易。如果你想了解更多相關資料,請參閱官方文件、以及它的 GitHub 頁面。

要注意的是,Swift Package 主要基於版本 (Versioning),確切地說是基於語意化版本 (Semantic Versioning) 標準。比如說,1.2.5 是一個版本編號的例子,它的第一個數字代表的是主版號 (Major Version),而第二個則是次版號 (Minor Version),第三個則是修訂號 (Patch Version)。我會在後面的部分提供這些數字簡要說明,不過如果你不太熟悉語意化版本系統,那麼你應該看看這裡了解一下。

已經是大趨勢的 Swift Package,似乎也會成為其他相依套件管理器的強勁競爭者。Xcode 11 簡化了建立及管理 Swift package,已經為它帶來優勢。而我最喜歡的,是幾乎可以馬上建立可重複使用的程式碼。話雖如此,請繼續讀下去,透過這篇實用指南,來看看我們如何建立和處理自己的 Swift Package。

使用 Swift Package 建立範例 App

本篇教學的目的,是展示如何從頭開始建立一個 Swift Package,所以這會是我們著力最深的地方。所以,我們將在這篇教學裡使用的範例 App 和範例程式碼沒那麼有趣、也不重要。請先下載初始專案,這將會是我們本次討論中的切入點。

解壓縮後,你會發現裡面有三個子資料夾:

  • Starter project 資料夾:這次的範例 App,也是我們將要撰寫程式碼的地方。
  • Public 資料夾:這裡含有一個 MathOperations 類別,它是我們將用作 Swift package 內容的範例程式碼。它與在初始專案裡的 MathOperations 類別有些差異,我們加了 public 修飾符進去,讓這裡的類別及任何必須的函數與屬性公開,好在 Package 之外也可看見。你將會在稍後更深入地了解這個概念。
  • Package 資料夾:我們將在本次文章中一步步建立的 Swift package。

這個初始專案是實作一個簡單的計算機 App,它能夠執行基本的四則運算:加、減、乘、除。App 本身不太有趣,而且沒什麼新東西可學,不過最重要的部分,在於如何執行數學運算、以及我們可以用它來做甚麼。

更準確來說,如果你在 Xcode 開啟初始專案的話,你會在 MathOperations.swift 檔案裡找到一個 MathOperations 類別(上文提過),這是我們用一些附加東西(像是 Operation 自定型別),來實作基礎四則運算的地方。這個類別遵循 Singleton 模式,所以在使用時不必建立實例。通過一個 shared 物件,我們可以使用所有提供的功能。

MathOperations 將在 ViewController.swift 檔案裡使用,我們會在這個檔案實作這個簡單計算機 App 的所有功能,當中有三個特別的 IBAction 方法:performOperation(_:)showResult(_:)clear(_:)。第一個方法會連接到 Main.storyboard 裡的四個運算符號按鈕(+、-、*、/),並且儲存所選的運算類型到 MathOperations 類別。第二個是實際觸發計算、並顯示結果給使用者的方法。最後一個方法就是清除 UITextField 裡的內容,並要求 MathOperations 初始化所有關鍵變數。

現在執行範例 App,然後看看初始專案大致的實作。不過,別花太多時間在這裡,因為這裡的目的不是要理解它的實作,而是將其作為接下來的「工具」使用。

demo-app

我們將要做甚麼?

現在,你已經初步了解了初始專案,讓我們來確認一下在這邊文章裡要達成甚麼目標。如你所見,所有的數學運算都發生在 MathOperations 類別中。現在,如果我們希望讓這個類別變成可重複使用的元件,該怎麼辦呢?如果我們希望在多個專案中使用相同的程式碼,該怎麼辦呢?更進一步來說,如果我們希望把它分享給其他開發者,讓他們可以在專案裡使用,又該怎麼辦呢?

答案很簡單:我們將建立一個 Swift Package,輕鬆管理上面的所有問題。

你可能會想只是一個檔案的程式碼,在任何情況下都可以輕易地分享、或是引入進其他專案,不值得花這麼多努力。不過,別忘了這只是一個示範專案。實際上,Package 含有多於一個的原始碼檔案,而且它也可能有自己的相依套件,也就是根它基於的其他框架或程式庫。

所以,讓我們開始動工,來建立一個基於 MathOperations 類別的 Swift Package。

建立你第一個 Swift Package

要建立一個新的 Swift Package,步驟非常簡單直接。前往 Xcode 的 File > New > Swift Package… 選單。

creating-swift-package-1

第一步是為 Package 指定名稱,並且在電腦裡選擇一個目的地資料夾,Package 的所有內容(包括檔案及資料夾)都將會儲存於此。跟著本次教學,將 Package 命名為 MathOpsPackage,並且選擇任何你覺得方便的地方儲存。

在視窗的底下,你會發現一些額外的選項。第一個是關於是否要為 Package 建立一個 Git 版本庫 (Repository)。我會建議不要勾選這個選項,以便按照文章接下來的步驟進行操作;但我們的確會在稍後建立一個版本庫。此外,點擊 Add to: 按扭選單,就可以直接添加新的 Package 到已存在的 Project 或是 Worksapce 中。不過這次我們不需要這個選項,所以請確認它維持在 Don’t add to any project or workspace 選項。

creating-swift-package-2

點擊 Create 按鈕後,Xcode 就會建立新的 Package。讓我們來看看它的檔案結構:

file-structure

Readme 檔案

你可以在這裡描述 Package 的 API、特色、功能、及任何你認為需要描述的東西。雖然你可能覺得這個檔案不重要,但這是其他人把你的 Package 整合到他們的專案時會看的東西。所以,這是你解釋你的 Package 的機會,我強烈建議你撰寫一份好的敘述,即使這個 Package 只是供你自己參考。當用了自己製作的 Package 一段時間後,你會感激自己填寫了寶貴的資訊,讓你可以輕鬆回想當作製作的重點。

在接下來的段落中,我們會在 GitHub 上建立版本庫,我們完成範例 Package 後就會將成品推送到 GitHub 上。Package 的 Readme 檔案將會是版本庫的 Readme 頁面,我認為這是要撰寫一段好描述的另一個理由。而 Readme 檔案有趣的是它支援 Markdown 格式,允許我們撰寫含有標頭 (header)、列表、圖像、連結等的文本。

關於我們在這裡建立的 MathOpsPackage,在這裡撰寫的下面敘述便已足夠。不過,如果你想的話,也可以輸入更多內容,以了解如何使用 Markdown 生成一篇格式漂亮的描述。

description

Package.Swift

Package.swiftPackage 設定的地方,它也被稱為 Package 的 manifest 檔案。我們會透過初始化 Package 類別的物件來進行設定,而完成之後將無法再變更,同時我們需要提供一系列參數,當中有些是強制性的、有些是可選的。當在建立新 Package 時,如果沒特別要求的話,Xcode 會為我們準備好預設設定。

// swift-tools-version:5.1
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "MathOpsPackage",
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
            name: "MathOpsPackage",
            targets: ["MathOpsPackage"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "MathOpsPackage",
            dependencies: []),
        .testTarget(
            name: "MathOpsPackageTests",
            dependencies: ["MathOpsPackage"]),
    ]
)

通常一個 Package 只會定義一個函式庫及一個 Target,所以 productstargets 的預設值已經足夠。不過,如果在 Package 中定義多於一個函式庫或 Target 的話,你就需要以預設初始化的類似方式來添加。

你可能會希望 dependencies 作為參數,來更頻繁地提供數值。你所指定 Package 建基於的其他 Pacakge,我們稱之為相依套件 (dependency)。在這種情況下,你必須提供該相依套件的本地端路徑或 URL(一個字串數值),以及應該遵循的版本規則;我們將在稍後了解更多關於版本規則的概念。但現在最重要的,是當指向一個相依套件時,我們也必須指定 Package 可以使用的版本或是版本範圍。如你在下面的截圖中所見,這裡有一些給 Package 指定相依套件用的初始器:

swift-package-dependency

依據你的需求,你可以從最小版號到下一個主版號指定相依套件,或者指定包含或不包含最新版號的版本範圍。例如,下面這段程式原就添加了從 1.2.3 版本到 2.3.4 版本的相依套件,包含了版本的下限及上限。

.package(url: "https://url/to/cool/dependency", "1.2.3"..."2.3.4")

下面是另一個例子,指定了相依套件的最小需求版本:

.package(url: "https://url/to/cool/dependency", from: 1.0.0)

除了上述之外,還有另一個在 Package 初始化中有用的參數,就是 platforms 參數。它是一個可選項目,因此不會存在於預設的模版程式碼中。你可以使用 platforms 參數,指定支援的作業系統、或是最低 OS 版本需求。Platforms 必須在 package 名稱之後指定,而每一個 platform 是一個特殊自定義型別 SupportedPlatform 的數值。下面定義了在 iOS 及 macOS 系統上執行的最低版本需求:

let package = Package(
    name: "MathOpsPackage",
    platforms: [
        SupportedPlatform.iOS(.v11),
        SupportedPlatform.macOS(.v10_14)
    ],
    ...
)

為了簡單起見,你可以省去 SupportedPlatform 型別:

platforms: [
    .iOS(.v11),
    .macOS(.v10_14)
]

要記住在 Package.swift 檔案裡設定 package 時,Xcode 是你的好幫手。當你試著指定不同的 package 設定數值時,自動補齊 (Auto-suggestions) 及快速協助 (Quick Help) 可以向你展示方法。你也可以參考官方文件,來得到額外的幫助。

另外要注意的是,Package.swift 檔案必須以 “// swift-tools-version” 開始,並在後面加上版本編號。那個編號指定了使用 package 所需的 Swift 工具及語言相容性的最小版本。你可以閱讀官方文件來了解更多。

Tests 資料夾

如果你為程式碼撰寫測試,並希望它們能被包含在 package 裡的話,你就應該把它們放在這裡。實際上,Xcode 建立了一個測試範例,你可以依你的需要去編輯、刪除、或是註解。在本篇文章中,我們不會添加任何測試,所以把下列程式碼加到 MathOpsPackageTests.swift 檔案裡:

// XCTAssertEqual(MathOpsPackage().text, "Hello, World!")

Sources 資料夾

這是 package 的核心,是你添加所有程式碼檔案所在的地方。你可以看到在我們建立的 package 裡,有一個同名子資料夾 MathOpsPackage 在 Sources 資料夾底下。在這個子資料夾裡面,你將找到跟 package 名字一樣的範例程式碼檔案,而這個檔案是由 Xcode 自動建立的。顯然我們不會繼續留著它,不過它是 Xcode 的一個指示,告訴你應該要把程式碼檔案放在哪裡。Source 底下的子資料夾,目的是在多個函式庫作為 package 成品的情況下,分離原始碼。當然,如我們之前所說,其他額外的函式庫也應在 Package.swift 檔案裡宣告。

添加程式碼到 Package

簡單探索過 package 的不同部分之後,是時候開始動手做了。我們想要重複使用及散佈的程式碼,已經存在於初始專案的 MathOperations.swift 檔案裡,所以我們不必撰寫任何新的程式碼,但我們就要將這個檔案從初始專案移動到 package。

只要幾個步驟就可以完成了:

  • 在 Xcode 裡同時開啟 SwiftPackageDemo 專案以及 MathOpsPackage
  • 從專案拖曳 MathOperations.swift 檔案到 package 裡的 Sources > MathOpsPackage 資料夾。這時,Xcode 應該在 ViewController 類別顯示錯誤。
  • MathOperations.swift 檔案會在專案裡顯示為紅色。在檔案上點擊右鍵,並選擇 Delete 來移除它。
  • 現在切換到 MathOpsPackage。刪除 Xcode 自動建立的 MathOpsPackage.swift 檔案。
  • 按下 Cmd + B 確認 package 能成功地 Build。
  • package 現在已經準備好了,所以先關閉它。

使用 Package

MathOpsPackage 現在包含了核心程式碼,讓數學運算可以運行。我們這裡的目標是將其整合進 SwiftPackageDemo 專案中,最後使用它。最簡單的方法就是將它拖拉至專案內。

  • 開啟 Finder,並前往 package 的目錄。
  • 把 Xcode 開啟放在 Finder 視窗旁,再拖曳 MathOpsPackage 目錄到 Project Navigator。
  • Xcode 會添加 package 到專案中,你將能夠打開它並進入原始碼檔案,就像你平常開啟獨立專案那樣。

這裡還有一些步驟需要執行:

  • 在 Project Navigator 中點擊 project 物件,然後確認可以看到 SwiftPackageDemoGeneral 分頁。
  • Frameworks, Libraries, and Embedded Content 區塊裡點擊新增按鈕(+)。
  • 在彈出來的視窗裡,選擇 MathOpsPackage 函式庫,點擊 Add。

所選的函式庫現在應該會 Frameworks 區塊裡列出:

swift-package-frameworks

最後,切換到滿是 Xcode 錯誤 ViewController.swift 檔案。前往檔案的最開頭,然後添加以下的 import 陳述句,來匯入 MathOpsPackage module 到檔案裡。

import MathOpsPackage

按下 Cmd + B 來 Build 專案,然後等待它完成。你大概會期望看到成功的訊息,不過還是沒有成功!為甚麼呢?

更改 API 的可見度

這次 Xcode 錯誤的原因十分簡單:ViewController 類別無法存取 MathOperations 類別,因為它們不是屬於同一個 Module,而 MathOperations 類別的存取等級預設為 internal。這表示現在只有 MathOpsPackage 裡的程式碼才能夠存取 MathOperations 類別。

解決這個問題的方法,就是使用 public 修飾符,來暴露類別與任何我們想要的屬性及方法。在 package 被整合進 SwiftPackageDemo 專案時,就可以完成修復,無需在 Xcode 中單獨打開它。

在 Xcode 展開 MathOpsPackage,然後到原始碼檔案。現在,我們不會手動進行任何修改,而是用更方便的方法:替換現在的原始碼檔案。在 MathOperations.swift 檔案上點擊右鍵,然後選擇 Delete。當系統詢問時,選擇 “move it to the trash”。然後,前往你為本次教學所下載的初始素材,在 Public 資料夾底下找到更新版本的 MathOperations.swift。直接將它拖曳至你剛剛刪除的位置,也就是 Sources > MathOpsPackage 資料夾底下的 MathOpsPackage

開啟你剛拉進 package 裡的新檔案,你將看到 public 關鍵字公開了所有需要給主專案的 ViewController 類別存取的程式碼。現在,再次按下 Cmd + B。如果你一直按著步驟做,你會看到這次的 Build 流程成功!恭喜你,剛剛在專案中首次使用了 Swift Package!

備註:你可以在這裡閱讀更多關於存取控制的內容。

在 GitHub 上發佈 Package

如果你的目標是建立 Swift Package,並保存在本地端的話,那麼你看到這裡就足夠了,你可以繼續建立自己的 package 來練習這個新知識。不過,即使你不打算與其他人分享你的 package,在 GitHub 上建立 git 版本庫並把 package 放在那裡,還是一個更方便的做法。說到重複使用你自定的元件,那麼簡單地從 GitHub 上擷取 package 到專案裡作為相依套件(實際上 Xcode 就是如此操作),一定會比你在本地端資料夾搜尋、拖曳、並冒著造成意外更改的風險更加安全。因為就如你所見,本地端的 package 在被整合進專案時,也能夠被調整修改。

所以在接下來的段落中,我們將說說這個情況:如何首先建立本地端版本庫,然後推送到 GitHub 來為 GitHub 準備 package。

建立一個本地端 Git 版本庫

首先,關閉 SwiftPackageDemo 專案,然後在 Xcode 裡單獨開啟 package。打開 Window > Welcome to Xcode 選單,然後從專案列表中選擇 package。或者,在 Finder 找到 package 資料夾,然後雙擊 Package.swift 檔案。

現在,在 Xcode 開啟了的 package 上進行這些步驟:

  • 前往 Source Control > Create Git Repositories… 選單。
  • 如果在彈跳出來的視窗中,package 沒有被預設選取,就點擊來選取它。
  • 點擊 Create 按鈕。

上面的步驟將會建立一個本地端的版本庫,然後它將提交所有 pakcage 檔案到版本庫。要注意的是,如果你初始建立 package 專案時,也建立了一個 git 版本庫的話,那麼上面的步驟將不會成功。如果你是這樣的情況,就使用 Source Control > Commit… 選單,來提交所有自 package 創建以來的所有變更。

連結 GitHub 帳號到 Xcode

下一步,我們要在 GitHub 上建立一個版本庫。你需要有一個 GitHub 帳號來完成這一步。如果你沒有的話,請先創建一個再繼續讀下去。

如果你還未添加 GitHub 帳號到 Xcode的話,就跟著下面的步驟來做吧。如果你已經連結了帳號的話,那你可以跳到下一個步驟。

  • 開啟 Xcode > Preferences… 選單,然後前往 Accounts 分頁。
  • 點擊視窗左下的新增按鈕(+)。
  • 選擇 “GitHub” 作為帳號類別,然後點擊 Continue。
  • 提供你的帳號名稱及密碼,接著點擊 Sign In。

建立遠端版本庫

設定好 GitHub 帳號之後,在 Xcode 開啟導覽列上的 Source Control,或是按下 Cmd + 2。然後執行下列步驟:

  • 選擇版本庫,然後前往 Editor > Create Remote… 選單;或者,更快的方法是在版本庫上點擊右鍵,選擇 Create “MathOpsPackage” Remote…
  • 在彈出來的視窗裡,大部分預設的選項都不需要更改。不過,當中版本庫預設選取為公開。如果你不想建立一個公開的版本庫,請選擇 Private,這樣你在 GitHub 上的版本庫就不會公開。之後你也可以更改它的可見度,或是選擇你希望分享的人。
  • 如果你不喜歡預設的推薦名稱 MathOpsPackage 的話,你可以自行更改。同時,如果你有多於一個連結到 Xcode 的 GitHub 帳號,請要確認你選擇了正確的那個。
repository-name

準備好之後,點擊 Create 按鈕。這將會執行兩個動作:第一是它將會在 GitHub 上建立新的版本庫,而第二是它將推送所有本地提交的變更到遠端版本庫。

推送 Package 版本

如我在這篇文章開頭所寫,Swift Package 主要基於版號,而且它們使用語意化版本標準來區別不同版本。這意味著 package 需要主版號次版號、及修訂號來表示一個統一編號,其中個部分之間以點 (A.B.C) 來分隔。總括來說,每個數字的意義是:

  • 主版號 (Major Number): 表示 package 的重要變更及新功能,這也可能導致無法向下相容。
  • 次版號 (Minor Number):表示較小的變動,像是新 API、或是不會破壞整體功能的重要修復。
  • 修訂號 (Patch Number):表示對現存 API 的小修正。

至今我們尚未為我們的 package 指定任何版號。唯一自動發生的,是當我們提交 package 檔案到版本庫時,指定給版本庫的識別碼 (identifier)。如果你在 Source Control (Cmd + 2) 選擇版本庫的話,你可以找到識別碼顯示在視窗的最右邊:

swift-package-identifier

跟著下面步驟來給予一個版號:

  • 右鍵點擊 Source Control 裡的版本庫。
  • 選擇 Tag “master”…
  • 在彈出來的視窗裡輸入版本編號,我們的範例 App 會使用數值 1.0.0。
  • 可選擇是否要輸入訊息。
  • 點擊 Create。

如你在 Xcode 所見,現在我們已經指定了一個 tag 編號給目前的專案版本。

swift-package-tag

不過這個 tag 編號只存在本地端。要把它推送到 GitHub 上,就按以下步驟:

  • 開啟 Source Control > Push… 選單。
  • 確認勾選包含 tags 的方框。
  • 另外,也要確認自動選取的遠端分支是正確的(本範例中是 origin/master)。
  • 點擊 Push 按鈕。

現在版號也存在於 GitHub 版本庫了。如果我們對 package 進行任何變更,並再次提交的話,我們會再一次依照此步驟的方式來更新版號。如果我們做的是小修改,版號就會是 1.0.1;如果我們添加新的東西到 MathOperations 類別,我們會將版號改為 1.1.0。

最後,如果你想看看 GitHub 上的 package 的話:

  • 右鍵點擊 Source Control 導覽列裡的版本庫。
  • 選擇 View on GitHub… 選項。

GitHub 頁面將會在你預設的網頁瀏覽器中打開。如果你需要尋找 tag 編號的話,點擊在檔案列表上面的 1 Release

使用遠端 Package

我們已經成功推送 package 到 GitHub 了。現在,你可以在 Xcode 關閉它,並再次開啟 SwiftPackageDemo 專案。學會了建立並推送 package 到遠端版本庫後,現在我們來看看如何使用存在於 GitHub 上的 package 吧!

首先,右鍵點擊 Xcode 範例專案裡的 MathOpsPackage package,並選擇 Delete 來刪除它。當 Xcode 詢問刪除選項時,請點擊 Remove Reference 按鈕,否則本地端的 package 專案就會被送到垃圾桶。

現在,在網頁瀏覽器開啟 GitHub 上的版本庫,點擊綠色 Clone or download 按鈕,並複製遠端版本庫的 URL。

再次回到 Xcode,開啟 File > Swift Packages > Add Package Dependency… 選單。在彈出來的視窗中,貼上你剛從 GitHub 上複製來的 URL,接著按下 Next 按鈕。

github-url

在下一個步驟中,你需要選擇想要使用的 package 版本,你可以選擇版號、分支、或識別碼。當 GitHub 上存在新版本時,你可以利用版本編號的選項來更新 Package。在預設情況下,Github 會選擇出現下一個主版號前的最新版本,這表示所有未來以 1 為開頭的版本都可以使用 (1.x.y),但更改主版號後的任何新版本就不適用了。點擊下拉按鈕會有其他選項,例如選擇版本範圍或是特定版號。

swift-package-versioning

對我們的範例專案來說,這裡的預設選項已經夠好,所以再次點擊 Next 按鈕。

Xcode 完成複製版本庫,並解決所以潛在問題後,最後一個步驟就是要選擇 package 應該加入的 Target。在範例專案裡,我們只有一個 Target,所以直接按下 Finish 按鈕。顯然地,我們應該選取 MathOpsPackage

swift-package-MathsOpsPackage

如果整個流程都沒有問題的話,package 就會在 Project 導覽列中出現,就像這樣:

swift-package-project

現在,我們 Build 專案來確認當中沒有任何錯誤。Package 程式庫會自動被加到上個段落最後步驟中,SwiftPackageDemo Target 的 Frameworks, Libraries, and Embedded Content 區塊。記得使用 import 關鍵字來匯入任何 package 加進專案裡的 Module,就像本次範例的 MathOperations

如果你使用的 package 有在 GitHub 上更新的話,那你可以輕易地到 File > Swift Packages > Update to Latest Package Versions 選單擷取最新的版本。此外,你也可以使用 File > Swift Packages > Reset Package Caches、和 File > Swift Packages > Resolve Package Versions,來修復 package 任何的潛在問題。

移除 Package 相依套件

在 Xcode 裡移除 package 相依套件非常簡單。在專案設定中開啟 Swift Packages 分頁,選擇你想要刪除的 package後,按下(-)按鈕來移除相依套件。

swift-package-dependency-2

總結

這樣看來,在 Apple 生態系統中,Swift Package 是重複使用及散佈程式碼的最佳方法。建立及使用 package 相依套件的流程又快又簡單。熟悉了這個步驟後,幾分鐘就可以完成了。

撰寫 package 裡的原始碼是最困難、最關鍵的部分,因為這實際上定義了 package 的存在。雖然在本篇文章中,我們用了現有的檔案來作為 package 的原始碼,我強烈建議你在實際專案裡整合的時候,撰寫你自己的 package 程式碼。這是最快的方法,讓你了解你添加進 package 的程式碼是否能與專案正常運作。當你完成時,依照前文的步驟將本地端 package 從專案中取出,並推送到 GitHub,之後就在那裡使用。

最後,我有一個小建議。當 package 整合進專案並且進行實作時,任何對 package 程式碼的新增及修改都不會立即被其他模組看見(例如主專案)。你要記得先 Build (Cmd + B) 專案,讓變更可見之後,才可以使用它們。

最後,我個人非常喜歡 Swift Package Manager,而目前為止我已製作很多公開或私有的 package。所以,我可以輕易又有效率地重複使用我的元件。我建議你也這樣做,相信我,你會發現這個步驟十分有意義!

譯者簡介:楊敦凱-目前於科技公司擔任 iOS Developer,工作之餘開發自有 iOS App 同時關注網路上有趣的新玩意、話題及科技資訊。平時的興趣則是與自身專業無關的歷史、地理、棒球。來信請寄到:[email protected]
原文A Practical Approach on Using Swift Package in Xcode

作者
Gabriel Theodoropoulos
資深軟體開發員,從事相關工作超過二十年,專門在不同的平台和各種程式語言去解決軟體開發問題。自2010年中,Gabriel專注在iOS程式的開發,利用教程與世界上每個角落的人分享知識。可以在Google+或推特關注 Gabriel。
評論
更多來自 AppCoda 中文版
很好! 你已成功註冊。
歡迎回來! 你已成功登入。
你已成功訂閱 AppCoda 中文版 電子報。
你的連結已失效。
成功! 請檢查你的電子郵件以獲取用於登入的連結。
好! 你的付費資料已更新。
你的付費方式並未更新。