JomloTableView: Migrasi Pod ke SPM

Seto Elkahfi
SwiftyID
Published in
3 min readSep 26, 2023

Package manager adalah fondasi dunia teknologi informasi. Pada salah satu video dari Route 85, sebuah seri YouTube dari pengembang aplikasi Google untuk iOS (ya, Google juga punya banyak aplikasi di iOS), naratornya pun bercanda:

We install a dependency manager to install a dependency manager.

Di dunia iOS sebelum era Swift Package Manager, CocoaPods merupakan standar de-facto package manager.

Cocoapods

Saya adalah seorang penganjur prinsip learning by doing. Saat saya memulai bekerja sebagai pengembang aplikasi iOS, saya juga mengaplikasikan prinsip itu. Salah satunya adalah belajar Cocoapods.

Pada waktu itu, proyek yang saya kerjakan menggunakan sebuah versi kustomisasi UITableView. Disitu, kita memisahkan antara section dan row. Jadi, sebuah UITableView tidak perlu menggunakan delegate.

Maka, saya pisahkan kode kustomisasi tersebut ke dalam sebuah Cocoapods Pod. Disitu saya belajar bagaimana membuat pustaka perangkat lunak yang bisa digunakan untuk orang lain. Berikut adalah struktur folder pada JomloTableView Pod:

JomloTableView Cocoapod

Cek repositorinya disini → https://github.com/setoelkahfi/JomloTableView

2023

Saya baru sadar, kode itu saya tulis tahun 2017 saat Swift masih dalam versi 3. Sekarang, Maret 2023, Swift sudah berada pada versi 5.7. Saatnya memperbarui Pod saya tersebut. Rencannaya adalah mensuport Swift Package Manager untuk Pod tersebut. Seharusnya tidak begitu sulit, mari kita coba.

Swift Package Manager

Swift Package Manager (selanjutnya SPM), bergantung pada beberapa konvensi dalam penamaan folder di dalam sebuat pustaka SPM. Misalnya, folder Sources berisi kode Swift untuk pustaka tersebut, dan folder Tests berisi kode test untuk pustaka tersebut. Self explanatory, kalau kata orang bule.

Untuk membuat sebuah pustaka SPM baru, seseorang bisa menggunakan swift CLI yang sudah terinstall secara otomatis dengan XCode. Setelah membuah folder baru dan berada pada direktori tersebut, masukkan perintah swift package init.

$ mkdir test-spm && cd test-spm
$ swift package init

Atau bisa dilihat di video dibawah ini:

Pindah-Pindah Files

Langkah pertama yang harus saya lakukan adalah membuat file Package.swift. Seseorang bisa juga menggunakan swift CLI untuk menginisiasi konfigurasi SPM pada Pod yang sudah ada. Tinggal masuk ke folder Pod package tersebut dan jalankan swift package init:

Langkah berikutnya yang perlu saya lalukan adalah mengatur penempatan files. Karena Cocoapods lebih fleksibel dalam hal ini, maka ketentuan SPM perlu di prioritaskan. Saya memindahkan semua kode sumber saya ke folder Sources/JomloTableView. Nama subfolder di dalam Sources harus sama dengan nama target SPM, kalau tidak, seseorang harus membuat opsi key path: ‘’path/ke/kode-sumber’ pada definisi file Package.swift.Apa itu target dan beberapa komponen SPM akan saya jelaskan pada artikel berikutnya.

Lalu saya juga perlu membuat folder Tests/JomloTableViewTests. Kovensi penamaan target test ini juga mengikuti konvensi penamaan target utama, yaitu harus sama dengan nama test target.

Commit hash → 7f70554b84cca8e3dd8eb8514307ca758d773fa8

IGNORE!

Untuk saat ini, SPM saya sudah bisa dibuka menggunakan XCode dan XCode akan menampilkan struktur folder yang benar:

Struktur folder SPM

Namun, saya tidak mau menampilan folder Example dan images, yang hanya berlaku untuk Cocoapods! Bagaimana solusinya? Ternyata tidak ada pilihan konfigurasi otomatis pada file Package.swift. Melainkan, saya harus membuat sebuah file Package.swift pada masing-masing folder yang perlu saya kucilkan.

Commit hash → 268673ea53f11b3bbea39c17f73066345fdfab88

CI/CD

Langkah selanjutnya adalah integrasi dengan CI/CD tools. Ini memerlukan perhatian khusus, karena UIKit bukanlah pustakan yang tersedia untuk semua platform. Dan Swift bisa berjalan pada Linux! Jadi, saya perlu menambahkan beberapa #if canImport compiler directive dan @available attribure untuk platform yang saya target, yaitu iOS dan tvOS.

Commit hash → ac2af453fb936ffb96deb78b6e0314ac869cf6fc

Langkah terakhir adalah menambahkan GitHub action untuk testing dan build.

Commit hash → 1b3b2384d6e9e5a1490807cd6627401341df75f9

SwiftPackageIndex

Sebagai bonus penutup, saya juga mengirimkan SPM baru saya ke SwiftPackageIndex, sebuah registry unofficial untuk Swift Package Manager. Untuk mempercantik repositiory, bisa juga ditambahkan lencana untuk menunjukkan platform yang didukung.

Commit hash → 02f6e647da5f0bf2660deaa0d0bad51e9ca6bd79

Demikian, semoga bermanfaat!

--

--

Seto Elkahfi
SwiftyID

Software developer. Rust, Ruby on Rails, AWS, iOS, tvOS,