遷移 Swift Package
Swift Package Manager 最初是作為 Swift 程式碼的依賴管理工具出現,卻無意中承擔起管理專案及支援 Objective-C 等其他程式語言的角色。由於該工具的設計初衷不同,在大型專案中使用它會面臨挑戰,因為它缺乏 Tuist 所提供的彈性、效能與強大功能。Scaling iOS at Bumble 一文清楚說明了這一點,當中包含以下表格,比較 Swift Package Manager 與原生 Xcode 專案的效能:

我們經常遇到開發者與組織質疑是否需要 Tuist,認為 Swift Package Manager 可以擔任類似的專案管理角色。有些團隊嘗試遷移後,才發現開發體驗大幅倒退。例如,重新命名一個檔案可能需要長達 15 秒來重新建立索引。15 秒!
Apple 是否會讓 Swift Package Manager 成為專為大規模設計的專案管理工具,目前仍不確定。 然而,我們並未看到任何跡象顯示這正在發生。事實上,情況恰恰相反。他們正做出受 Xcode 啟發的決策,例如透過隱式設定來追求便利,而你可能知道,這正是大規模下產生複雜性的根源。我們認為,Apple 需要回歸基本原則,重新檢視一些作為依賴管理工具有意義、但作為專案管理工具並不合適的決策,例如使用編譯型語言作為定義專案的介面。
Tuist 將 Swift Package Manager 視為依賴管理工具,而且它在這方面表現出色。我們用它來解析依賴並進行建構。我們不會用它來定義專案,因為它並非為此設計。
從 Swift Package Manager 遷移至 Tuist#
Swift Package Manager 與 Tuist 之間的相似性使遷移過程變得直接。主要差異在於,你將使用 Tuist 的 DSL 而非 Package.swift 來定義專案。
首先,在 Package.swift 檔案旁邊建立 Project.swift 檔案。Project.swift 檔案將包含你的專案定義。以下是一個 Project.swift 檔案的範例,定義了一個包含單一 target 的專案:
import ProjectDescription
let project = Project(
name: "App",
targets: [
.target(
name: "App",
destinations: .iOS,
product: .app,
bundleId: "dev.tuist.App",
sources: ["Sources/**/*.swift"]*
),
]
)
注意事項:
- ProjectDescription:你將使用
ProjectDescription,而非PackageDescription。 - Project: 你將匯出
project實例,而非package實例。 - Xcode 語言: 你用來定義專案的基本元素模仿了 Xcode 的語言,因此你會找到 schemes、targets 和 build phases 等項目。
接著建立包含以下內容的 Tuist.swift 檔案:
import ProjectDescription
let tuist = Tuist()
Tuist.swift 包含你的專案設定,其路徑用作確定專案根目錄的參考。你可以查看目錄結構文件,以進一步了解 Tuist 專案的結構。
編輯專案#
你可以使用tuist edit在 Xcode 中編輯專案。該命令會生成一個 Xcode 專案,你可以開啟並開始工作。
tuist edit
視乎專案大小,你可以考慮一次性或逐步採用。我們建議從小型專案開始,以熟悉 DSL 和工作流程。我們的建議是始終從被依賴最多的 target 開始,逐步向上處理至頂層 target。