Back home

Seri Swift Package Manager 03|Konsep utama dalam Package.swift

Yang benar-benar sulit adalah memahami arti produk, target, dan ketergantungan dalam batasan proyek.

Saat pertama kali membuka Package.swift, kesan pertama Anda adalah: filenya tidak panjang dan sintaksnya tidak rumit.

Namun mudah untuk menjadi bingung setelah Anda benar-benar memulai proyek, karena kesulitannya sama sekali bukan pada “apakah sintaksnya terlihat seperti Swift”, tetapi pada kenyataan bahwa beberapa konsep inti di dalamnya sebenarnya sesuai dengan struktur proyek, bukan item konfigurasi biasa.

Jika Anda hanya menganggapnya sebagai “daftar untuk mengisi beberapa kolom”, Anda akan sering merasa bahwa Anda mengetahui setiap kata, namun akan mudah membingungkan saat Anda mengubahnya. Yang benar-benar perlu dipahami adalah pertanyaan apa yang dijawab oleh konsep-konsep ini.

Yang paling penting adalah menangkap peran-peran inti ini terlebih dahulu:

  • paket
  • produk
  • ketergantungan
  • target

1. Package.swift menjelaskan hubungan modul

Ini adalah langkah pertama untuk memahaminya.

Situasi yang umum terjadi adalah Anda secara tidak sadar menganggapnya sebagai:

-File konfigurasi proyek

  • Tergantung pada file instalasi
  • atau “Podspec untuk Swift”

Namun dari sudut pandang teknik, Package.swift lebih seperti spesifikasi hubungan modul. Ini memberi tahu rantai alat:

  • Apa yang diberikan paket ini kepada dunia luar?
  • Paket eksternal mana yang bergantung padanya?
  • Target apa saja yang dibuat secara internal?
  • Bagaimana target-target ini saling terkait satu sama lain

Jadi ini berfokus pada “bagaimana kode ini harus disusun menjadi modul dan digunakan oleh orang lain.”

2. Jawaban products: Kemampuan apa yang ingin diberikan paket ini kepada dunia luar?

Ini adalah poin yang paling mudah diabaikan ketika pertama kali menangani masalah seperti ini.

target adalah unit bangunan internal, dan product adalah hasil konsumsi eksternal.

Dengan kata lain, pertanyaan yang dijawab oleh product adalah:

Apa tujuan akhir dari paket ini untuk diekspos kepada penggunanya?

Ada sinyal desain yang sangat penting di balik hal ini. Jika Anda tidak tahu tentang product, struktur internal paket mudah tertukar dengan penggunaan eksternalnya.

Tentu saja, bisa ada beberapa target di dalam sebuah paket, namun pihak luar tidak perlu mengetahui semua pemisahan internal ini. Jadi product pada dasarnya mengemas antarmuka eksternal.

Jika Anda memahaminya dari sudut pandang ini, Anda akan berpikir lebih alami:

  • Target internal mana yang merupakan rincian implementasi
  • Kemampuan apa yang benar-benar perlu diekspos?
  • Tingkat apa yang harus dilihat oleh tanggungan eksternal?

3. Jawaban dependencies: Kemampuan apa yang dipinjam paket ini dari dunia luar?

Ketika saya melihat situasi ini dependencies, saya hanya berpikir untuk “menginstal perpustakaan pihak ketiga”.

Namun dari sudut pandang teknik, arti yang lebih penting adalah:

Di luar batasan modul ini, bergantung pada dunia luar apa.

Hal ini secara langsung akan mempengaruhi:

  • Apakah modulnya cukup ringan?
  • Apakah biaya kompilasinya mahal?
  • Apakah mudah untuk digunakan kembali di masa mendatang?
  • Apakah ini juga akan mengikat proyek host ke dalam beberapa dependensi eksternal?

Jika sebuah modul memiliki terlalu banyak ketergantungan eksternal, hal ini sering kali menyebabkan dua masalah:

  • Ini tidak lagi ringan
  • Batasannya juga mulai tidak jelas

Jadi ketika melihat dependencies, jangan hanya berpikir “bisakah diinstal”, tetapi pikirkan juga “mengapa modul ini perlu mengandalkan hal-hal ini”.

4. Jawaban targets: Bagaimana seharusnya kode internal diatur dan dikompilasi?

Ini adalah bagian Package.swift yang paling mudah dianggap sebagai “pemetaan folder”, namun sebenarnya lebih dari itu.

target benar-benar sesuai dengan:

  • Sekelompok kode yang dikompilasi bersama
  • Unit ketergantungan eksplisit
  • batas modul internal

Saat Anda menentukan target, Anda memutuskan:

  • Kode mana yang harus berkembang bersama
  • Implementasi mana yang harus ditempatkan di unit kompilasi yang sama
  • Tes mana yang harus sesuai dengan batasan ini

Jadi target adalah salah satu unit terkecil yang membawa modularitas internal.

Jika Anda memecah target menjadi terlalu banyak bagian, proyek akan menjadi lebih berat. Jika target dibuat terlalu besar maka batasnya akan menjadi kabur. Ini juga menunjukkan bahwa Package.swift tampaknya hanya sebuah konfigurasi, namun sebenarnya membawa banyak penilaian arsitektural.

5. Bingung product dengan target

Karena dalam paket sederhana seringkali berkorespondensi satu lawan satu.

Misalnya:

  • sebuah sasaran
  • produk perpustakaan

Saat ini, mudah untuk salah mengira bahwa kedua konsep tersebut serupa. Namun begitu proyek menjadi sedikit lebih rumit, Anda akan menemukan:

  • Sebuah paket dapat memiliki banyak target
  • Beberapa target dapat melayani satu produk
  • Beberapa target hanya merupakan implementasi internal dan tidak boleh diekspos secara langsung

Jadi pengalaman saya adalah: **Memahami target sebagai struktur internal dan produk sebagai outlet eksternal. **

Dengan cara ini pemikiran akan menjadi lebih jelas sekaligus.

6. Target pengujian juga sangat penting

Saat pertama kali melihat Package.swift, Anda akan menganggap target pengujian sebagai konfigurasi aksesori. Namun dari sudut pandang pemikiran modular, ini sebenarnya sangat penting.

Karena nilai sebuah modul tidak layak untuk berdiri sendiri, hal ini juga sebagian besar tercermin dalam:

  • Apakah bisa diuji secara mandiri
  • Apakah batasan ketergantungannya cukup jelas
  • Apakah dapat memverifikasi perilaku inti tanpa bergantung pada aplikasi host

Jika sebuah modul harus bergantung pada setengah dari proyek host untuk setiap pengujian, maka meskipun namanya adalah Paket, batasannya mungkin tidak independen pada kenyataannya.

7. Tatanan bacaan yang lebih praktis

Jika saya membuka Package.swift untuk proyek asing untuk pertama kalinya, saya biasanya melihatnya dalam urutan ini:

1.products Mari kita lihat dulu apa yang dieksposnya ke dunia luar. 2.dependencies Mari kita lihat apa yang dipinjamnya dari dunia luar 3.targets Terakhir, mari kita lihat bagaimana interiornya dibongkar.

Manfaat dari rangkaian ini adalah: Lihatlah batasannya terlebih dahulu, lalu lihat ke dalam, daripada terjebak dalam detail implementasi.

8. Kesimpulan: Kesulitan Package.swift bukan pada sintaksisnya, tetapi pada deskripsi sebenarnya batasan proyek.

Singkatnya, saya akan mengatakan:

Package.swift Yang paling penting adalah apakah Anda dapat memahami hubungan batas di balik product, dependency, dan target.

Setelah dipahami dari perspektif ini, file ini bukan lagi sekadar konfigurasi, namun merupakan ekspresi ringkas dari desain modul.

FAQ

What to read next

Related

Continue reading