Section 2/131 menit
2. Masalah yang Dipecahkan
2. Masalah yang Dipecahkan
Merge Conflict Tak Berujung di .xcodeproj
swift
# ❌ TANPA project generator: setiap developer menambah file → konflik
<<<<<<< HEAD
7A8B9C = {isa = PBXBuildFile; fileRef = 7A8B9D; };
=======
7A8B9C = {isa = PBXBuildFile; fileRef = 7A8B9E; };
>>>>>>> feature/add-login-view
# File .xcodeproj (khususnya project.pbxproj) berisi UUID opaque
# yang berubah setiap kali Xcode melakukan drag-and-drop file.
# Resolve conflict ini membutuhkan pemahaman internal format Xcode
# dan sangat rentan error — salah resolve = build gagal.
swift
# ✓ DENGAN XcodeGen: tambah file → edit project.yml yang human-readable
sources:
- Sources/
# Menambah file baru cukup dengan menaruh file di folder Sources/
# project.yml tidak berubah — tidak ada merge conflict
Konfigurasi Target yang Copy-Paste dan Drift
swift
# ❌ TANPA generator: 10 targets di Xcode = konfigurasi diduplikasi 10x
# Build settings di Target A berbeda sedikit dari Target B
# Tidak ada cara mudah mendeteksi perbedaan atau enforce konsistensi
# Developer baru override satu setting di satu target → drift
swift
// ✓ DENGAN Tuist: definisi target reusable dan di-share
let commonSettings: SettingsDictionary = [
"SWIFT_VERSION": "6.0",
"IPHONEOS_DEPLOYMENT_TARGET": "17.0",
"ENABLE_STRICT_OBJC_MSGSEND": "YES",
]
func makeFeatureTarget(name: String) -> Target {
.target(
name: name,
destinations: .iOS,
product: .framework,
bundleId: "com.company.\(name.lowercased())",
sources: ["Modules/\(name)/Sources/**"],
settings: .settings(base: commonSettings)
)
}
// Semua feature module inherit settings yang sama — tidak ada drift
Build Time yang Lambat karena Recompile Berulang
swift
# ❌ TANPA incremental caching yang proper:
# Ubah 1 file di modul Core → seluruh app rebuild dari nol
# Team dengan 50+ modul bisa butuh 20-40 menit untuk clean build
# Dengan Xcode default incremental build:
# - Tidak deterministik (kadang perlu clean build)
# - Tidak bisa di-share antar developer atau CI
swift
# ✓ DENGAN Bazel: hermetic build dengan distributed cache
# BUILD file mendefinisikan input/output secara eksplisit
# Jika input tidak berubah → output dari cache (lokal atau remote)
# Build time 30 menit → 2-3 menit dengan remote cache hit