Pada satu proyek besar, kami mengalami kecepatan build yang rendah - mulai dari tiga menit atau lebih. Biasanya, dalam kasus seperti itu, studio mempraktikkan modularisasi proyek agar tidak bekerja dengan monolit besar. Di Surf, kami memutuskan untuk bereksperimen dan memodularisasi proyek menggunakan Swift Package Manager, manajer ketergantungan Apple.
Kami akan membahas hasilnya di artikel lain, tetapi sekarang kami akan menjawab pertanyaan utama: mengapa semua ini diperlukan, mengapa kami memilih SPM dan bagaimana kami mengambil langkah pertama.
Mengapa SPM
Jawabannya sederhana - ini asli dan baru. Itu tidak membuat overhead xcworkspace seperti Cocoapods, misalnya. Selain itu, SPM adalah proyek sumber terbuka yang sedang berkembang secara aktif. Apple dan komunitas sedang memperbaiki bug, memperbaiki kerentanan, memperbarui untuk mengikuti Swift.
Apakah itu membuat pembangunan proyek lebih cepat
Secara teori, perakitan akan mempercepat karena fakta membagi aplikasi menjadi modul - kerangka kerja. Ini berarti bahwa setiap modul hanya akan dibuat jika ada perubahan terhadapnya. Tapi akan mungkin untuk menegaskan dengan pasti hanya di akhir percobaan.
Catatan: Efektivitas modularisasi secara langsung bergantung pada pembagian proyek yang benar ke dalam modul.
Bagaimana membuat partisi yang efisien
Metode partisi bergantung pada arsitektur yang dipilih, jenis aplikasi, ukurannya, dan rencana pengembangan lebih lanjut. Oleh karena itu, saya akan berbicara tentang tiga aturan yang kami coba patuhi saat pemisahan.
Bagikan fungsionalitas umum. Setiap modul bertanggung jawab atas suatu kategori, misalnya:
- CommonAssets - sekumpulan Aset Anda dan antarmuka publik untuk mengaksesnya. Biasanya dibuat menggunakan SwiftGen.
- CommonExtensions - sekumpulan ekstensi, misalnya Foundation, UIKit, dependensi tambahan.
Alur aplikasi terpisah. Pertimbangkan struktur pohon, di mana MainFlow adalah aliran utama aplikasi. Katakanlah kita memiliki aplikasi berita.
- NewFlow - layar berita dan ikhtisar berita tertentu.
- FavoritesFlow — .
- SettingsFlow — , , . .
reusable :
- CommonUIComponents — , UI-. .
- UI . , , , . .
Katakanlah kita memiliki aliran tertentu dan kita ingin menambahkan fungsi baru padanya. Jika komponen akan digunakan kembali atau secara teoritis memungkinkan di masa mendatang, sebaiknya pindahkan ke modul terpisah atau analog dari CommonUIComponents. Dalam kasus lain, Anda dapat membiarkan komponen lokal.
Pendekatan ini memecahkan masalah komponen yang hilang. Ini terjadi dalam proyek besar, dan jika komponen tidak didokumentasikan, pemeliharaan dan debuggingnya akan menjadi tidak menguntungkan.
Buat proyek menggunakan SPM
Pertimbangkan untuk membuat proyek uji yang sepele. Saya menggunakan proyek Aplikasi Multiplatform di SwiftUI. Platform dan antarmuka tidak relevan di sini.
Catatan: Untuk membuat Aplikasi Multiplatform dengan cepat, Anda memerlukan XCode 12.2 beta. Mari buat sebuah
proyek dan lihat yang berikut ini:
Sekarang mari buat modul Common pertama:
- tambahkan folder Frameworks tanpa membuat direktori;
- membuat paket SPM Umum.
- Tambahkan platform yang didukung ke file Package.swift. Kami memilikinya
platforms: [.iOS(.v14), .macOS(.v10_15)]
- Sekarang kami menambahkan modul kami ke setiap target. Kami memiliki SPMExampleProject untuk iOS dan SPMExampleProject untuk macOS.
Catatan: Cukup menghubungkan modul root saja ke target. Mereka tidak ditambahkan sebagai submodul.
Koneksi selesai. Sekarang yang harus Anda lakukan adalah mengkonfigurasi modul dengan antarmuka publik - dan voila, modul pertama sudah siap.
Cara menambahkan ketergantungan untuk paket SPM lokal
Mari tambahkan paket AdditionalInfo - sebagai Common, tetapi tanpa menambahkannya ke target. Sekarang mari kita ubah Package.swift dari Common package.
Anda tidak perlu menambahkan apapun. Dapat digunakan.
Contoh yang mendekati kenyataan
Mari hubungkan SwiftGen ke proyek uji kita dan tambahkan modul Palette - itu akan bertanggung jawab untuk mengakses palet warna yang disetujui oleh desainer.
- Buat modul root baru dengan mengikuti petunjuk di atas.
- Tambahkan direktori root Scripts and Templates ke situ.
- Tambahkan file Palette.xcassets ke root modul dan tuliskan set warna apa pun.
- Tambahkan file Palette.swift kosong ke Sources / Palette.
- Tambahkan template palette.stencil ke folder Templates .
- Sekarang Anda perlu mendaftarkan file konfigurasi untuk SwiftGen. Untuk melakukan ini, tambahkan file swiftgen.yml ke folder Scripts dan tulis yang berikut ini di dalamnya:
xcassets:
inputs:
- ${SRCROOT}/Palette/Sources/Palette/Palette.xcassets
outputs:
- templatePath: ${SRCROOT}/Palette/Templates/palette.stencil
params:
bundle: .module
publicAccess: true
output: ${SRCROOT}/Palette/Sources/Palette/Palette.swift
Tampilan akhir dari
modul Palette Kami telah mengkonfigurasi modul Palette . Sekarang kita perlu mengonfigurasi peluncuran SwiftGen sehingga palet dibuat pada awal pembuatan. Untuk melakukan ini, buka konfigurasi setiap target dan buat Fase Build baru - sebut saja generator Palette. Jangan lupa untuk memindahkan Fase Build ini ke posisi setinggi mungkin.
Sekarang kami menulis panggilan untuk SwiftGen:
cd ${SRCROOT}/Palette
/usr/bin/xcrun --sdk macosx swift run -c release swiftgen config run --config ./Scripts/swiftgen.yml
Catatan:
/usr/bin/xcrun --sdk macosxadalah awalan yang sangat penting. Tanpanya, build akan menghasilkan error: "tidak dapat memuat library standar untuk target 'x86_64-apple-macosx10.15".
Contoh panggilan untuk SwiftGen
Done - warna dapat diakses sebagai berikut:
Palette.myGreen(Jenis warna di SwiftUI) dan PaletteCore.myGreen(UIColor / NSColor).
Batuan bawah air
Saya akan membuat daftar apa yang kami temui.
- .
- SwiftLint & SwiftGen SPM. yml.
- Cocoapods. — , SPM . SPM Cocoapods - : «MergeSwiftModule failed with a nonzero exit code». , .
- SPM .
-L$(BUILD_DIR).
SPM — Bundler?
Dalam hal ini, saya mengusulkan untuk bermimpi dan berdiskusi di komentar. Topiknya perlu dipelajari dengan baik, tapi kelihatannya sangat menarik. Omong-omong, sudah ada artikel menarik yang agak dekat tentang pro dan kontra SPM.
SPM memberi Anda kemampuan untuk memanggil swift run dengan menambahkan Package.swift ke root proyek Anda. Apa yang diberikannya kepada kita? Misalnya, Anda dapat memanggil fastlane atau swiftlint. Contoh panggilan:
swift run swiftlint --autocorrect.