3. Teori: Cara Kerja Swift Package Manager
3. Teori: Cara Kerja Swift Package Manager
SPM bekerja dalam empat fase: manifest evaluation → resolution → build graph → compilation.
Fase 1: Manifest Evaluation
Package.swift adalah Swift program. Saat SPM membaca-nya:
- SPM mengkompilasi
Package.swiftjadi binary kecil. - Binary dijalankan; output-nya adalah deskripsi package (JSON internal).
- SPM cache hasil ini sampai
Package.swiftberubah.
Konsekuensi penting: kamu bisa menggunakan logika Swift di manifest — if, loop, helper function — selama hasil akhirnya valid.
// swift-tools-version:5.10
import PackageDescription
let isDebug = ProcessInfo.processInfo.environment["DEBUG"] != nil
let package = Package(
name: "MyLib",
targets: [
.target(
name: "MyLib",
swiftSettings: isDebug ? [.define("DEBUG_LOGGING")] : []
)
]
)
Fase 2: Resolution
SPM membaca semua .package(...) di manifest + transitive dependencies, lalu menyelesaikan versi:
- Bangun dependency graph dari semua package.
- Untuk tiap package, pilih versi yang memenuhi semua constraint (algoritma Pubgrub).
- Tulis hasil ke
Package.resolved. - Clone repo ke
.build/checkouts/di versi yang dipilih.
Algoritma Pubgrub (sama dengan yang dipakai Dart pub & Cargo) menjamin deterministik: input sama → output sama. Berbeda dengan resolver lama yang bisa loop atau lambat di graph kompleks.
Fase 3: Build Graph
SPM membangun DAG (Directed Acyclic Graph) dari semua target:
- Target executable depends on target library.
- Target library depends on target dari package lain.
- Target test depends on target yang dites.
Build dieksekusi paralel sesuai dependency. Target yang independen di-compile bersamaan.
Fase 4: Compilation & Linking
Untuk tiap target:
- Kumpulkan source file (default:
Sources/<TargetName>/**/*.swift). - Resolve resources (default:
Sources/<TargetName>/Resources/). - Compile dengan
swiftc→ object files. - Link object files + dependency products → library/executable.
Output disimpan di .build/<config>/.
Cache Strategy
SPM punya tiga level cache:
- Manifest cache — hasil evaluasi
Package.swift. - Repository cache — clone Git repos (
~/Library/Caches/org.swift.swiftpm/). - Build cache — incremental compilation output (
.build/).
Cache repository di-share antar project — kalau project A sudah download Alamofire, project B tidak perlu download ulang.