Section 3/172 menit

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:

  1. SPM mengkompilasi Package.swift jadi binary kecil.
  2. Binary dijalankan; output-nya adalah deskripsi package (JSON internal).
  3. SPM cache hasil ini sampai Package.swift berubah.

Konsekuensi penting: kamu bisa menggunakan logika Swift di manifest — if, loop, helper function — selama hasil akhirnya valid.

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

  1. Bangun dependency graph dari semua package.
  2. Untuk tiap package, pilih versi yang memenuhi semua constraint (algoritma Pubgrub).
  3. Tulis hasil ke Package.resolved.
  4. 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:

  1. Kumpulkan source file (default: Sources/<TargetName>/**/*.swift).
  2. Resolve resources (default: Sources/<TargetName>/Resources/).
  3. Compile dengan swiftc → object files.
  4. 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.