3. Teori: Cara Kerja Masing-Masing Tool
3. Teori: Cara Kerja Masing-Masing Tool
XcodeGen: Template Engine untuk .xcodeproj
XcodeGen membaca project.yml dan menghasilkan .xcodeproj yang valid menggunakan library XcodeProj. Proses ini sepenuhnya deterministik — input yang sama selalu menghasilkan output yang sama.
project.yml (sumber kebenaran, di-commit)
↓
xcodegen generate
↓
MyApp.xcodeproj (di-gitignore, tidak di-commit)
↓
Xcode build system (xcodebuild)
↓
Build artifacts
Karena .xcodeproj tidak di-commit, merge conflict tidak bisa terjadi pada file tersebut. Konflik hanya bisa terjadi di project.yml yang mudah di-merge secara manual.
Tuist: Workspace Intelligence Layer
Tuist bekerja di dua level:
Level 1 — Project Generation:
Project.swift / Workspace.swift (Swift DSL, di-commit)
↓
tuist generate
↓
*.xcodeproj + *.xcworkspace (di-gitignore)
↓
Xcode build (atau tuist build)
Level 2 — Binary Caching:
tuist cache warm (build semua dependencies sebagai XCFramework)
↓
XCFramework di-cache di ~/.tuist/Cache/
↓
tuist generate (inject XCFramework sebagai pre-built binary)
↓
Hanya module yang berubah yang dikompilasi ulang
Tuist memodelkan seluruh dependency graph dan dapat mendeteksi circular dependencies saat generate — bukan saat build.
Bazel: Hermetic Build Graph
Bazel mengoperasikan model yang sangat berbeda:
BUILD files (definisi rules, di-commit)
↓
Bazel analyzes dependency graph
↓
Check remote cache (Bazel Remote Cache / BuildBuddy / EngFlow)
├── Cache hit → unduh artifact (detik)
└── Cache miss → build action → upload ke cache
↓
IPA / XCFramework / test results
Hermeticity adalah kunci Bazel: setiap build action hanya melihat input yang dideklarasikan secara eksplisit. Jika ada file yang tidak dideklarasikan diakses, build gagal. Ini memastikan reproducibility — build di mesin developer identik dengan build di CI.