メタデータ・タグ
プロジェクトの規模が大きくなり、複雑になってくると、コードベース全体を一度に扱うことは非効率になりかねない。Tuistは、開発中にターゲットを論理的なグループに整理し、プロジェクトの特定の部分に集中する方法として、メタデータタグ を提供しています。
メタデータ・タグとは?
メタデータ・タグは、プロジェクトのターゲットに付けることができる文字列ラベルです。これらは、以下のことを可能にするマーカーとして機能する:
- Group related targets - 同じ機能、チーム、またはアーキテクチャレイヤーに属するターゲットをタグ付けする。
- ワークスペースを絞り込む - 特定のタグを持つターゲットのみを含むプロジェクトを生成する。
- ワークフローの最適化 - コードベースの関連性のない部分をロードすることなく、特定の機能に取り組むことができます。
- Select targets to keep as sources - キャッシュ時にソースとして保持するターゲットのグループを選択する。
タグは、ターゲットのメタデータ プロパティを使用して定義され、文字列の配列として格納されます。
メタデータ・タグの定義
プロジェクトマニフェスト内の任意のターゲットにタグを追加できます:
swift
import ProjectDescription
let project = Project(
name: "MyApp",
targets: [
.target(
name: "Authentication",
destinations: .iOS,
product: .framework,
bundleId: "com.example.authentication",
sources: ["Sources/**"],
metadata: .metadata(tags: ["feature:auth", "team:identity"])
),
.target(
name: "Payment",
destinations: .iOS,
product: .framework,
bundleId: "com.example.payment",
sources: ["Sources/**"],
metadata: .metadata(tags: ["feature:payment", "team:commerce"])
),
.target(
name: "App",
destinations: .iOS,
product: .app,
bundleId: "com.example.app",
sources: ["Sources/**"],
dependencies: [
.target(name: "Authentication"),
.target(name: "Payment")
]
)
]
)タグ付けされたターゲットに焦点を当てる
ターゲットにタグを付けたら、tuist generate コマンドを使って、特定のターゲットだけを含む集中プロジェクトを作成することができる:
タグ別フォーカス
特定のタグにマッチするすべてのターゲットを含むプロジェクトを生成するには、tag: プレフィックスを使用します:
bash
# Generate project with all authentication-related targets
tuist generate tag:feature:auth
# Generate project with all targets owned by the identity team
tuist generate tag:team:identity名前でフォーカス
また、特定のターゲットを名指しでフォーカスすることもできる:
bash
# Generate project with the Authentication target
tuist generate Authenticationフォーカスの仕組み
目標に集中する:
- Included targets - クエリにマッチしたターゲットが生成されたプロジェクトに含まれる。
- 依存関係 - フォーカスされたターゲットのすべての依存関係が自動的に含まれます。
- テストターゲット - 焦点となるターゲットのテストターゲットが含まれる。
- Exclusion - 他のすべてのターゲットをワークスペースから除外する。
つまり、機能開発に必要なものだけを収めた、より小さく管理しやすいワークスペースが手に入るのだ。
タグの命名規則
どんな文字列でもタグとして使用できますが、一貫した命名規則に従うことで、タグを整理しておくことができます:
swift
// Organize by feature
metadata: .metadata(tags: ["feature:authentication", "feature:payment"])
// Organize by team ownership
metadata: .metadata(tags: ["team:identity", "team:commerce"])
// Organize by architectural layer
metadata: .metadata(tags: ["layer:ui", "layer:business", "layer:data"])
// Organize by platform
metadata: .metadata(tags: ["platform:ios", "platform:macos"])
// Combine multiple dimensions
metadata: .metadata(tags: ["feature:auth", "team:identity", "layer:ui"])feature:,team:,layer: のような接頭辞を使うことで、各タグの目的を理解しやすくなり、名前の衝突を避けることができる。
プロジェクト記述ヘルパーでタグを使う
プロジェクト記述ヘルパーを活用することで、プロジェクト全体でタグの適用方法を標準化することができます:
swift
// Tuist/ProjectDescriptionHelpers/Project+Templates.swift
import ProjectDescription
extension Target {
public static func feature(
name: String,
team: String,
dependencies: [TargetDependency] = []
) -> Target {
.target(
name: name,
destinations: .iOS,
product: .framework,
bundleId: "com.example.\(name.lowercased())",
sources: ["Sources/**"],
dependencies: dependencies,
metadata: .metadata(tags: [
"feature:\(name.lowercased())",
"team:\(team.lowercased())"
])
)
}
}そしてそれをマニフェストに使う:
swift
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project(
name: "Features",
targets: [
.feature(name: "Authentication", team: "Identity"),
.feature(name: "Payment", team: "Commerce"),
]
)メタデータ・タグを使用するメリット
開発経験の向上
プロジェクトの特定の部分に集中することで、それが可能になる:
- Xcodeプロジェクトのサイズを縮小 - より小さなプロジェクトで作業することで、開いたり移動したりするのが速くなります。
- ビルドのスピードアップ - 現在の仕事に必要なものだけをビルドする。
- 集中力の向上 - 関係のないコードに気を取られないようにする。
- インデックス作成の最適化 - Xcodeはより少ないコードにインデックスを作成し、オートコンプリートを高速化します。
より良いプロジェクト組織
タグはコードベースを整理する柔軟な方法を提供する:
- 複数のディメンション - 機能、チーム、レイヤー、プラットフォーム、その他のディメンションでターゲットをタグ付けします。
- 構造変更なし - ディレクトリのレイアウトを変更することなく、組織構造を追加。
- 横断的な関心事 - 1つのターゲットが複数の論理グループに属することがある。
キャッシュとの統合
メタデータタグはTuistのキャッシュ機能とシームレスに動作します:
bash
# Cache all targets
tuist cache
# Focus on targets with a specific tag and use cached dependencies
tuist generate tag:feature:paymentベストプラクティス{#best-practices}。
- シンプルに始める - 単一のタグ付けディメンション(例:フィーチャー)から始め、必要に応じて拡張する。
- 一貫性を保つ - すべてのマニフェストで同じ命名規則を使用する。
- タグを文書化する - プロジェクトの文書に、利用可能なタグとその意味のリストを残す。
- ヘルパーの使用 - プロジェクト記述ヘルパーを活用し、タグの適用を標準化する。
- 定期的な見直し - プロジェクトの進展に合わせて、タグ戦略を見直し、更新する。
