3. Teori: Cara Kerja SPM Resolver & Build Graph
3. Teori: Cara Kerja SPM Resolver & Build Graph
Dependency Resolution — PubGrub Algorithm
SPM menggunakan algoritma PubGrub (dikembangkan oleh Natalie Weizenbaum untuk Dart's pub package manager) sejak Swift 5.2. Sebelumnya SPM menggunakan backtracking resolver yang jauh lebih lambat.
PubGrub bekerja dengan cara:
- Term dan Incompatibilities: Resolver memodelkan setiap requirement sebagai "term" dan konflik sebagai "incompatibility"
- Unit Propagation: Jika sebuah package harus ada di versi X, propagate constraint ini ke semua dependensi dari X
- Conflict Resolution: Ketika dua constraint bertabrakan, resolver mencari "root cause" dengan backtracking ke decision point terkecil
- Partial Solution: Resolver membangun solusi bertahap, menghindari full backtracking
Implikasi praktis:
- Resolver sangat cepat untuk kasus umum (linear complexity)
- Error message mencantumkan mengapa resolusi gagal, bukan sekadar "cannot resolve"
- Diamond dependency (A→C, B→C dengan range berbeda) diselesaikan dengan menemukan intersection range
Build System — llbuild
SPM menggunakan llbuild (Low-Level Build System) yang juga dipakai Xcode. llbuild adalah reactive build system berbasis rule-based computation:
Package.swift
↓ (parse)
Package Graph (targets + dependencies)
↓ (resolve)
Build Plan (compilation units per target)
↓ (execute)
llbuild Rules
├── SwiftCompilerTool (per source file)
├── LinkTool (per product)
├── CopyTool (per resource)
└── PluginTool (per build plugin invocation)
Incremental Build: llbuild menyimpan dependency graph antara input file dan output. Perubahan pada NetworkManager.swift hanya menyebabkan recompile NetworkManager.swift dan semua file yang mengimport symbol dari dalamnya.
Compilation Mode:
--configuration debug:-Onone, full debug info, faster compile--configuration release:-O(whole-module optimization by default), slower compile, faster binary
Module Resolution & Modulemap
Setiap SPM target dikompilasi menjadi Swift module (.swiftmodule) atau C/ObjC module (via .modulemap). SPM otomatis generate module.modulemap untuk target yang berisi header C/ObjC, memungkinkan import dari Swift.