Section 11/171 menit

11. Migrasi Bertahap dari XcodeGen ke Tuist

11. Migrasi Bertahap dari XcodeGen ke Tuist

Fase 1: Analisis dan Persiapan

swift
# Langkah 1: Audit project.yml saat ini
# Buat inventory semua targets, dependencies, dan build settings
cat project.yml | grep -E "^  [a-zA-Z]+" | awk '{print $1}' > targets.txt

# Langkah 2: Install Tuist via mise
mise use tuist@latest

# Langkah 3: Buat struktur folder Tuist/
mkdir -p Tuist/ProjectDescriptionHelpers

Fase 2: Buat Tuist Config dan Helpers Minimal

swift
// Tuist/Config.swift
import ProjectDescription

let config = Config(
    compatibleXcodeVersions: .list(["16.2"]),
    swiftVersion: "6.0"
)
swift
// Tuist/Package.swift — pindahkan SPM dependencies dari project.yml
import PackageDescription

let package = Package(
    name: "MyApp",
    dependencies: [
        // Pindahkan satu per satu dari project.yml packages section
        .package(url: "https://github.com/Alamofire/Alamofire", from: "5.9.0"),
    ]
)

Fase 3: Migrasi Module per Module (Leaf First)

swift
// Strategi: mulai dari leaf modules (tidak ada dependency ke first-party)
// Urutan: Core modules dulu, lalu Shared, lalu Feature, terakhir App

// Langkah per module:
// 1. Buat Projects/Core/NetworkKit/Project.swift
// 2. Tambahkan ke Workspace.swift
// 3. Hapus entry dari project.yml
// 4. Jalankan tuist generate + xcodegen generate bersama-sama
// 5. Validasi build masih hijau
// 6. Lanjut ke module berikutnya
swift
// Projects/Core/NetworkKit/Project.swift — contoh migrasi pertama

import ProjectDescription
import ProjectDescriptionHelpers

// Equivalent dari XcodeGen:
// NetworkKit:
//   type: framework
//   platform: iOS
//   sources: Modules/NetworkKit/Sources
//   settings:
//     base:
//       PRODUCT_BUNDLE_IDENTIFIER: com.company.networkkit
//       SWIFT_VERSION: 6.0

let project = Project.module(
    name: "NetworkKit",
    layer: .core,
    dependencies: []
)

Fase 4: Validasi dan Cutover

swift
# Jalankan kedua tools secara paralel selama transisi
# Sampai semua module dipindah, generate keduanya dan validasi identik

# XcodeGen (legacy)
xcodegen generate --spec project.yml --project ./

# Tuist (new)
tuist generate

# Build keduanya dan bandingkan hasil
xcodebuild build -scheme MyApp -destination "generic/platform=iOS Simulator"

# Setelah semua module dipindah:
# 1. Hapus project.yml
# 2. Hapus .gitignore entry untuk XcodeGen
# 3. Tambahkan .gitignore entry untuk Tuist generated files
# 4. Update CI scripts