Belajar Swift - Package Management & Modularization
Episode 10 of 23

Belajar Swift - Package Management & Modularization

Episode ini membahas Swift Package Manager (SPM): fondasi dan cara kerja, pembuatan package executable maupun library dengan dependency, struktur multi-target dengan test target, serta integrasi SPM ke dalam Xcode project untuk modularisasi yang sehat.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Seiring aplikasi tumbuh, satu target raksasa menjadi sulit dipelihara, sulit diuji, dan sulit dibagikan. Episode 10 membahas package management dan modularization — alat yang menyelesaikan masalah ini: Swift Package Manager (SPM), dependency manager resmi Swift.

SPM bukan sekadar alat mengunduh library. Ia juga model distribusi dan strukturisasi kode modern: aplikasi, library, dan tool diorganisasi menjadi package yang dapat diuji, di-versi-kan, dan digunakan kembali lintas project dan platform. Kuasai SPM dan kalian membuka pintu ekosistem Swift open source.

Fondasi Swift Package Manager

Cara Kerja SPM

SPM adalah tool dari Swift toolchain yang mengelola tiga hal: membangun source, menyelesaikan dependency, dan menguji package. Berbeda dengan CocoaPods dan Carthage, SPM terintegrasi dengan compiler, sehingga tidak perlu memanggil tool pihak ketiga terpisah.

Manifes bernama Package.swift adalah otak package. Di sanalah seluruh konfigurasi dideklarasikan:

Buat package executable
mkdir CatatanCLI && cd CatatanCLI
swift package init --type executable

swift package init --type executable menghasilkan layout standar sekaligus file Package.swift dan satu file source. Pilihan --type lain termasuk library, executable, dan empty.

Menjalankan dan Menguji

Package executable langsung bisa dibangun dan dijalankan:

Build dan jalankan
swift build
swift run CatatanCLI
swift test

swift build mengkompilasi seluruh package dan dependency-nya, swift run CatatanCLI menjalankan executable, dan swift test membangun serta menjalankan semua test. Ketiganya memakai manifest yang sama — tidak ada konfigurasi ganda.

Manifest dan Dependency

Membaca Package.swift

Manifes modern mengikuti format:

Package.swift dasar
// swift-tools-version: 6.0
import PackageDescription
 
let package = Package(
    name: "CatatanCLI",
    platforms: [.macOS(.v13)],
    dependencies: [
        .package(url: "https://github.com/apple/swift-argument-parser.git",
                 from: "1.3.0")
    ],
    targets: [
        .executableTarget(
            name: "CatatanCLI",
            dependencies: [.product(name: "ArgumentParser",
                                    package: "swift-argument-parser")]
        )
    ]
)

.package(url:from:) menambahkan dependency dari URL git dengan batas versi minimum, dan .product(name:package:) menghubungkan produk library ke target. Perhatikan baris pertama // swift-tools-version yang menentukan versi manifest.

Menyelesaikan Dependency

Perintah berikut mengunduh dan mengunci versi dependency:

Resolve dependency
swift package resolve
swift package show-dependencies

swift package resolve mengunduh dependency dan mencatat versi yang terpilih ke Package.resolved. Selalu versi-kan file ini agar seluruh tim membangun dengan dependency yang identik — di CI, perintah ini menjadikan build reproducible.

Multi-Target Package

Memisahkan Library dan Executable

Package yang baik memisahkan logika (library) dari interface (executable). Library bisa diuji dan digunakan kembali; executable hanya memanggil library:

Manifest multi-target
let package = Package(
    name: "IntiCatatan",
    targets: [
        .target(name: "IntiCatatan"),
        .executableTarget(name: "CatatanCLI",
                          dependencies: ["IntiCatatan"]),
        .testTarget(name: "IntiCatatanTests",
                    dependencies: ["IntiCatatan"])
    ]
)

.target(name: "IntiCatatan") mendefinisikan library, .executableTarget aplikasi yang memakainya, dan .testTarget tempat test. Pemisahan ini memungkinkan testing logika tanpa perlu menjalankan executable, dan mempermudah kalian membangun kembali hanya bagian yang berubah.

Struktur Direktori Multi-Target

Layout yang dihasilkan:

Struktur multi-target
IntiCatatan/
├── Package.swift
├── Sources/
   ├── IntiCatatan/
   └── IntiCatatan.swift
   └── CatatanCLI/
       └── main.swift
└── Tests/
    └── IntiCatatanTests/
        └── IntiCatatanTests.swift

Setiap folder di Sources/ adalah satu target, dan folder di Tests/ adalah satu test target. Kesepakatan ini membuat SPM menemukan file secara otomatis tanpa konfigurasi tambahan.

Integrasi dengan Xcode

Menambahkan Package ke Project

Xcode mendukung SPM secara native. Kalian menambahkan dependency lewat menu File > Add Package Dependencies, memasukkan URL git atau nama library, lalu memilih versi. Xcode kemudian membangun package sebagai bagian dari project tanpa setup tambahan.

Integrasi dua arah juga berlaku: Xcode project bisa dipakai sebagai dependency SPM, sehingga tim bisa membagikan modul UI maupun logika. Episode 16 akan memakai pola ini untuk arsitektur modular di aplikasi besar.

Perintah Bantuan SPM

Beberapa perintah yang sering dipakai:

Alat bantu SPM
swift package dump-package
swift package describe
swift package update

swift package dump-package menampilkan manifest sebagai JSON terpecah, swift package describe merinci target dan dependency, dan swift package update memperbarui dependency ke versi terbaru yang diizinkan. Kombinasikan dengan Git agar perubahan manifest terdokumentasi.

Tip

Uji package kalian di luar Xcode dulu dengan swift build dan swift test. Package yang bersih dari terminal hampir selalu terintegrasi mulus ke Xcode, dan ini membuat codebase kalian bisa dibangun di CI tanpa GUI.

Penutup

Inti yang harus dibawa pulang:

  • SPM adalah dependency manager resmi yang terintegrasi dengan toolchain Swift.
  • Package.swift mendeklarasikan platform, dependency, dan target.
  • swift build, swift run, dan swift test membangun seluruh alur kerja.
  • Pisahkan library dari executable agar logika bisa diuji dan dipakai ulang.
  • Versi-kan Package.resolved untuk build yang reproducible.
  • Xcode mendukung SPM native untuk menambah dan mengelola package.

Di episode 11 selanjutnya kita akan membahas secure coding dan data protection — praktik secure coding dan validasi data, penggunaan Keychain untuk menyimpan credential dengan aman, enkripsi dan hashing dasar di Swift, serta secure storage, sandboxing, dan privasi di platform Apple. Keamanan dimulai dari kode!

Belajar Swift - Package Management & Modularization | Belajar Swift