Halaman ini menjelaskan cara mem-build atau menguji project Xcode dengan Bazel. Panduan ini menjelaskan perbedaan antara Xcode dan Bazel, serta menyediakan langkah-langkah untuk mengonversi project Xcode ke project Bazel. Bagian ini juga memberikan solusi pemecahan masalah untuk mengatasi error yang umum terjadi.
Perbedaan antara Xcode dan Bazel
Bazel mengharuskan Anda untuk menentukan setiap target build dan dependensinya secara eksplisit, serta setelan build yang sesuai melalui aturan build.
Bazel memerlukan semua file yang menjadi tempat dependensi project agar ada dalam direktori ruang kerja atau ditentukan sebagai impor dalam file
WORKSPACE
.Saat membuat project Xcode dengan Bazel, file
BUILD
menjadi sumber kebenaran. Jika mengerjakan project di Xcode, Anda harus membuat project Xcode versi baru yang cocok dengan fileBUILD
menggunakan Tulsi setiap kali mengupdate fileBUILD
. Jika Anda tidak menggunakan Xcode, perintahbazel build
danbazel test
memberikan kemampuan membangun dan menguji dengan batasan tertentu yang akan dijelaskan nanti dalam panduan ini.Karena perbedaan skema konfigurasi build, seperti tata letak direktori atau flag build, Xcode mungkin tidak sepenuhnya mengetahui "gambaran besar" build, sehingga beberapa fitur Xcode mungkin tidak berfungsi. Yaitu:
Bergantung pada target yang Anda pilih untuk dikonversi di Tulsi, Xcode mungkin tidak dapat mengindeks sumber project dengan benar. Hal ini memengaruhi penyelesaian dan navigasi kode di Xcode, karena Xcode tidak akan dapat melihat semua kode sumber project.
Analisis statis, pembersih alamat, dan pembersih thread mungkin tidak berfungsi karena Bazel tidak menghasilkan output yang diharapkan Xcode untuk fitur-fitur tersebut.
Jika Anda membuat project Xcode dengan Tulsi dan menggunakan project tersebut untuk menjalankan pengujian dari dalam Xcode, Xcode akan menjalankan pengujian, bukan Bazel. Untuk menjalankan pengujian dengan Bazel, jalankan perintah
bazel test
secara manual.
Sebelum memulai
Sebelum memulai, lakukan hal berikut:
Instal Bazel jika Anda belum melakukannya.
Jika Anda tidak terbiasa dengan Bazel dan konsepnya, selesaikan tutorial aplikasi iOS). Anda harus memahami ruang kerja Bazel, termasuk file
WORKSPACE
danBUILD
, serta konsep target, aturan build, dan paket Bazel.Menganalisis dan memahami ketergantungan proyek.
Menganalisis dependensi proyek
Tidak seperti Xcode, Bazel mengharuskan Anda secara eksplisit mendeklarasikan semua dependensi untuk setiap target dalam file BUILD
.
Untuk informasi selengkapnya tentang dependensi eksternal, lihat Bekerja dengan dependensi eksternal.
Membuat atau menguji project Xcode dengan Bazel
Untuk membuat atau menguji project Xcode dengan Bazel, lakukan hal berikut:
Langkah 1: Buat file WORKSPACE
Buat file WORKSPACE
di direktori baru. Direktori ini menjadi root
ruang kerja Bazel. Jika project tidak menggunakan dependensi eksternal, file ini boleh
kosong. Jika project bergantung pada file atau paket yang tidak ada dalam salah satu
direktori project, tentukan dependensi eksternal ini dalam file
WORKSPACE
.
Langkah 2: (Eksperimental) Integrasikan dependensi CocoaPods
Untuk mengintegrasikan dependensi CocoaPods ke dalam ruang kerja Bazel, Anda harus mengonversinya menjadi paket Bazel seperti yang dijelaskan dalam Mengonversi dependensi CocoaPods.
Langkah 3: Buat file BUILD
Setelah menentukan ruang kerja dan dependensi eksternal, Anda perlu
membuat file BUILD
yang memberi tahu Bazel tentang struktur project. Buat
file BUILD
di root ruang kerja Bazel dan konfigurasikan untuk melakukan
build awal project seperti berikut:
- Langkah 3a: Tambahkan target aplikasi
- Langkah 3b: (Opsional) Tambahkan target pengujian
- Langkah 3c: Tambahkan target library
Tips: Untuk mempelajari lebih lanjut paket dan konsep Bazel lainnya, lihat Ruang kerja, paket, dan target.
Langkah 3a: Tambahkan target aplikasi
Tambahkan target aturan macos_application
atau ios_application
. Target ini masing-masing membuat paket aplikasi macOS atau iOS.
Dalam target, tentukan hal minimum berikut:
bundle_id
- ID paket (jalur DNS terbalik diikuti dengan nama aplikasi) biner.provisioning_profile
- menyediakan profil dari akun Apple Developer Anda (jika membuat build untuk perangkat iOS).families
(khusus iOS) - apakah akan mem-build aplikasi untuk iPhone, iPad, atau keduanya.infoplists
- daftar file .plist untuk digabungkan ke dalam file Info.plist final.minimum_os_version
- versi minimum macOS atau iOS yang didukung aplikasi. Hal ini akan memastikan Bazel mem-build aplikasi dengan API level yang benar.
Langkah 3b: (Opsional) Tambahkan target pengujian
Aturan build Apple Bazel mendukung pengujian unit berbasis library untuk dijalankan di iOS dan macOS, serta pengujian berbasis aplikasi di macOS. Untuk pengujian berbasis aplikasi di pengujian iOS atau UI pada salah satu platform, Bazel akan mem-build output pengujian, tetapi pengujian harus dijalankan dalam Xcode melalui project yang dihasilkan dengan Tulsi. Tambahkan target pengujian sebagai berikut:
macos_unit_test
untuk menjalankan pengujian unit berbasis library dan berbasis aplikasi di macOS.ios_unit_test
untuk menjalankan pengujian unit berbasis library di iOS. Untuk pengujian yang memerlukan simulator iOS, Bazel akan mem-build output pengujian, tetapi tidak akan menjalankan pengujian. Anda harus membuat project Xcode dengan Tulsi dan menjalankan pengujian dari dalam Xcode.ios_ui_test
untuk mem-build output yang diperlukan untuk menjalankan pengujian antarmuka pengguna di simulator iOS menggunakan Xcode. Anda harus membuat project Xcode dengan Tulsi dan menjalankan pengujian dari dalam Xcode. Bazel tidak dapat menjalankan pengujian UI secara native.
Minimal, tentukan nilai untuk atribut minimum_os_version
. Meskipun
atribut paket lainnya, seperti bundle_identifier
dan infoplists
,
disetel secara default ke nilai yang paling umum digunakan, pastikan default tersebut kompatibel
dengan project dan menyesuaikannya sesuai kebutuhan. Untuk pengujian yang memerlukan simulator iOS, tentukan juga nama target ios_application
sebagai nilai atribut test_host
.
Langkah 3c: Menambahkan target library
Tambahkan target objc_library
untuk setiap library Objective C dan target swift_library
untuk setiap library Swift yang diandalkan aplikasi dan/atau pengujian.
Tambahkan target library sebagai berikut:
Tambahkan target library aplikasi sebagai dependensi ke target aplikasi.
Tambahkan target library pengujian sebagai dependensi ke target pengujian.
Cantumkan sumber implementasi pada atribut
srcs
.Cantumkan header dalam atribut
hdrs
.
Untuk mengetahui informasi selengkapnya tentang aturan build, lihat Aturan Apple untuk Bazel.
Pada tahap ini, sebaiknya uji build:
bazel build //:<application_target>
Langkah 4: (Opsional) Buat perincian build
Jika projectnya besar, atau seiring pertumbuhannya, pertimbangkan untuk membaginya menjadi beberapa paket Bazel. Peningkatan perincian ini memberikan:
Peningkatan inkrementalitas build,
Peningkatan paralelisasi tugas build,
Kemudahan pemeliharaan yang lebih baik untuk pengguna di masa depan,
Kontrol yang lebih baik atas visibilitas kode sumber di seluruh target dan paket. Hal ini akan mencegah masalah seperti library yang berisi detail implementasi yang bocor ke API publik.
Tips untuk memberikan perincian proyek:
Masukkan setiap library dalam paket Bazel-nya sendiri. Mulailah dengan yang memerlukan dependensi paling sedikit dan lanjutkan ke hierarki dependensi.
Saat Anda menambahkan file
BUILD
dan menentukan target, tambahkan target baru ini ke atributdeps
target yang bergantung padanya.Fungsi
glob()
tidak melewati batas paket, sehingga jumlah paket bertambah, file yang cocok denganglob()
akan menyusut.Saat menambahkan file
BUILD
ke direktorimain
, tambahkan juga fileBUILD
ke direktoritest
yang sesuai.Menerapkan batas visibilitas yang baik di seluruh paket.
Build project setelah setiap perubahan besar pada file
BUILD
dan perbaiki error build yang Anda temui.
Langkah 5: Jalankan build
Menjalankan build yang dimigrasikan sepenuhnya untuk memastikannya selesai tanpa error atau peringatan. Jalankan setiap aplikasi dan uji target satu per satu agar lebih mudah menemukan sumber error yang terjadi.
Contoh:
bazel build //:my-target
Langkah 6: Buat project Xcode dengan Tulsi
Saat mem-build dengan Bazel, file WORKSPACE
dan BUILD
akan menjadi sumber
kebenaran tentang build. Agar Xcode mengetahuinya, Anda harus membuat project Xcode yang kompatibel dengan Bazel menggunakan Tulsi.
Pemecahan masalah
Error Bazel dapat muncul saat tidak sinkron dengan versi Xcode yang dipilih, seperti saat Anda menerapkan update. Berikut beberapa hal yang dapat dicoba jika Anda mengalami error dengan Xcode, misalnya "Xcode version must be {i>use to use an Apple CROSSTOOL".<i}
Jalankan Xcode secara manual dan setujui persyaratan dan ketentuan apa pun.
Gunakan pemilihan Xcode untuk menunjukkan versi yang benar, menerima lisensi, dan menghapus status Bazel.
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license
bazel sync --configure
- Jika tidak berhasil, Anda juga dapat mencoba menjalankan
bazel clean --expunge
.