Swift Package の移行
Swift Package Manager は Swift コードの依存関係マネージャーとして登場し、結果的にプロジェクト管理や Objective-C などの他のプログラミング言語のサポートという課題を解決する役割も担うようになりました。しかし、このツールは本来異なる目的で設計されたため、Tuist が提供する柔軟性、パフォーマンス、およびパワーに欠けており、大規模なプロジェクト管理には課題があります。この点は Bumble での iOS スケーリング という記事でよく説明されており、Swift Package Manager とネイティブな Xcode プロジェクトのパフォーマンスを比較した以下の表が含まれています。

Swift Package Manager が同様のプロジェクト管理の役割を果たせることを理由に、Tuist の必要性に疑問を抱く開発者や組織によく出会います。移行に着手したものの、後に開発者体験が著しく劣化したことに気づくケースもあります。例えば、ファイルの名前変更によって再インデックスに最大 15 秒かかることがあります。15 秒です!
Apple が Swift Package Manager を大規模向けに最適化されたプロジェクトマネージャーにするかどうかは不透明です。 しかし、その動きを示す兆候は見られません。むしろ、逆の傾向が見られます。彼らは暗黙的な設定による利便性の追求など、Xcode に影響を受けた判断を下しており、ご存知のように、これがスケール時の複雑さの原因となります。私たちは、Apple が根本原理に戻り、依存関係マネージャーとしては理にかなっていたがプロジェクトマネージャーとしては不適切だった一部の判断(例えば、プロジェクト定義のインターフェースとしてコンパイル言語を使用することなど)を見直す必要があると考えています。
Tuist は Swift Package Manager を依存関係マネージャーとして扱い、それは優れたツールです。私たちは依存関係の解決とビルドにそれを使用しています。プロジェクトの定義には使用しません。その目的で設計されていないためです。
Swift Package Manager から Tuist への移行#
Swift Package Manager と Tuist の類似性により、移行プロセスは簡単です。主な違いは、Package.swift の代わりに Tuist の DSL を使用してプロジェクトを定義することです。
まず、Package.swift ファイルの隣に Project.swift ファイルを作成します。Project.swift ファイルにはプロジェクトの定義が含まれます。単一のターゲットを持つプロジェクトを定義する Project.swift ファイルの例を以下に示します。
import ProjectDescription
let project = Project(
name: "App",
targets: [
.target(
name: "App",
destinations: .iOS,
product: .app,
bundleId: "dev.tuist.App",
sources: ["Sources/**/*.swift"]*
),
]
)
注意点:
- ProjectDescription:
PackageDescriptionの代わりにProjectDescriptionを使用します。 - Project:
packageインスタンスをエクスポートする代わりに、projectインスタンスをエクスポートします。 - Xcode 言語: プロジェクトを定義するために使用するプリミティブは Xcode の言語を模倣しているため、スキーム、ターゲット、ビルドフェーズなどが見つかります。
次に、以下の内容で Tuist.swift ファイルを作成します。
import ProjectDescription
let tuist = Tuist()
Tuist.swift にはプロジェクトの設定が含まれており、そのパスはプロジェクトのルートを決定するための参照として機能します。Tuist プロジェクトの構造について詳しく知りたい場合は、ディレクトリ構造 のドキュメントをご覧ください。
プロジェクトの編集#
tuist edit を使用して、Xcode でプロジェクトを編集できます。このコマンドは、開いて作業を開始できる Xcode プロジェクトを生成します。
tuist edit
プロジェクトの規模に応じて、一括で実行するか、段階的に実行するかを検討してください。DSL とワークフローに慣れるために、小さなプロジェクトから始めることをお勧めします。私たちのアドバイスは、常に最も依存されているターゲットから始め、トップレベルのターゲットまで順に進めていくことです。