Section 3/131 menit

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.

swift
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:

swift
Project.swift / Workspace.swift  (Swift DSL, di-commit)
     ↓
  tuist generate
     ↓
*.xcodeproj + *.xcworkspace  (di-gitignore)
     ↓
  Xcode build (atau tuist build)

Level 2 — Binary Caching:

swift
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:

swift
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.