Section 3/171 menit

3. Teori: Arsitektur Internal Tuist

3. Teori: Arsitektur Internal Tuist

Pipeline Eksekusi tuist generate

swift
Tuist/Package.swift + Projects/**/*.swift
          ↓
  1. Manifest Loading
     Tuist compile semua *.swift di Tuist/ dan Projects/**/ sebagai Swift module
     menggunakan SwiftPM, lalu load sebagai dynamic library
          ↓
  2. Graph Construction
     Bangun dependency graph dari semua Target dan dependencies yang dideklarasikan
     Validasi tidak ada circular dependency
     Validasi bahwa referenced targets ada
          ↓
  3. Linting
     Cek duplicate bundle IDs, missing Info.plist, invalid settings, dll
          ↓
  4. Side Effect Processing
     Jalankan plugins dan pre-generation hooks
          ↓
  5. Project Generation
     Convert Tuist's internal model ke XcodeProj model
     Generate .xcodeproj dan .xcworkspace files
          ↓
  6. Post-Generation
     Jalankan post-generation hooks
     Update derived data jika perlu

Hash Calculation untuk Binary Cache

Binary cache Tuist menggunakan deterministic hash untuk setiap target. Hash dihitung dari:

swift
Target Hash Input:
├── Source files (content hash, bukan timestamp)
├── Resource files (content hash)
├── Build settings (sorted key-value pairs)
├── Swift flags (copts)
├── Dependency hashes (recursive — perubahan di leaf otomatis invalidate dependents)
├── Xcode version (dari .xcode-version atau System Xcode)
├── Swift toolchain version
└── Platform & deployment target

Karena hash bersifat content-based (bukan time-based), cache valid selama tidak ada konten yang berubah — bukan hanya karena git pull.

Manifest Compilation

Tuist file (Project.swift, Workspace.swift, dll) dikompilasi sebagai Swift module. Ini berarti:

  • Import works: bisa import ProjectDescriptionHelpers
  • Type checking: kesalahan konfigurasi terdeteksi saat compile manifest
  • IDE support: autocomplete dan error highlighting di Project.swift
swift
Tuist/
├── ProjectDescriptionHelpers/   ← dikompilasi sebagai module terpisah
│   ├── Project+Templates.swift
│   └── Settings+Base.swift
└── Config.swift                 ← bisa import ProjectDescriptionHelpers
swift
Projects/
└── FeatureHome/
    └── Project.swift            ← bisa import ProjectDescriptionHelpers