Halaman ini menjelaskan cara mem-build atau menguji project Xcode dengan Bazel. Halaman ini menjelaskan perbedaan antara Xcode dan Bazel, serta memberikan langkah-langkah untuk mengonversi project Xcode menjadi project Bazel. Halaman ini juga memberikan solusi pemecahan masalah untuk mengatasi error umum.
Perbedaan antara Xcode dan Bazel
Bazel mengharuskan Anda menentukan setiap target build dan dependensinya secara eksplisit, serta setelan build yang sesuai melalui aturan build.
Bazel mengharuskan semua file yang menjadi dependensi project berada dalam direktori ruang kerja atau ditentukan sebagai impor dalam file
WORKSPACE.Saat mem-build project Xcode dengan Bazel, file
BUILDakan menjadi sumber kebenaran. Jika Anda mengerjakan project di Xcode, Anda harus membuat versi baru project Xcode yang cocok dengan fileBUILDmenggunakan Tulsi setiap kali Anda memperbarui fileBUILD. Jika Anda tidak menggunakan Xcode, perintahbazel builddanbazel testakan memberikan kemampuan build dan pengujian dengan batasan tertentu yang dijelaskan nanti dalam panduan ini.Karena perbedaan dalam 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 konversi 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, address sanitizer, dan thread sanitizer mungkin tidak berfungsi, karena Bazel tidak menghasilkan output yang diharapkan Xcode untuk 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 testsecara manual.
Sebelum memulai
Sebelum memulai, lakukan hal berikut:
Instal Bazel jika Anda belum melakukannya.
Jika Anda belum memahami Bazel dan konsepnya, selesaikan tutorial aplikasi iOS). Anda harus memahami ruang kerja Bazel, termasuk file
WORKSPACEdanBUILD, serta konsep target, aturan build, dan paket Bazel.Analisis dan pahami dependensi project.
Menganalisis dependensi project
Tidak seperti Xcode, Bazel mengharuskan Anda mendeklarasikan semua dependensi secara eksplisit untuk setiap target dalam file BUILD.
Untuk mengetahui informasi selengkapnya tentang dependensi eksternal, lihat Menggunakan dependensi eksternal.
Mem-build atau menguji project Xcode dengan Bazel
Untuk mem-build atau menguji project Xcode dengan Bazel, lakukan hal berikut:
Langkah 1: Buat file WORKSPACE
Buat file WORKSPACE di direktori baru. Direktori ini akan menjadi root ruang kerja Bazel. Jika project tidak menggunakan dependensi eksternal, file ini dapat kosong. Jika project bergantung pada file atau paket yang tidak ada di salah satu direktori project, tentukan dependensi eksternal ini dalam file WORKSPACE.
Langkah 2: (Eksperimental) Integrasikan dependensi CocoaPods
Untuk mengintegrasikan dependensi CocoaPods ke ruang kerja Bazel, Anda harus mengonversi nya 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 sebagai berikut:
- Langkah 3a: Tambahkan target aplikasi
- Langkah 3b: (Opsional) Tambahkan target pengujian
- Langkah 3c: Tambahkan target library
Tips: Untuk mempelajari paket dan konsep Bazel lainnya lebih lanjut, lihat Ruang kerja, paket, dan target.
Langkah 3a: Tambahkan target aplikasi
Tambahkan target aturan macos_application
atau ios_application. Target ini mem-build paket aplikasi macOS atau iOS.
Di target, tentukan hal berikut minimal:
bundle_id- ID paket (jalur DNS terbalik yang diikuti dengan nama aplikasi) dari biner.provisioning_profile- profil penyediaan dari akun Apple Developer Anda (jika mem-build untuk perangkat iOS).families(khusus iOS) - apakah akan mem-build aplikasi untuk iPhone, iPad, atau keduanya.infoplists- daftar file .plist yang akan digabungkan ke dalam file Info.plist akhir.minimum_os_version- versi minimum macOS atau iOS yang didukung aplikasi. Hal ini memastikan Bazel mem-build aplikasi dengan tingkat API yang benar.
Langkah 3b: (Opsional) Tambahkan target pengujian
Aturan build Apple Bazel mendukung pengujian unit berbasis library di iOS dan macOS, serta pengujian berbasis aplikasi di macOS. Untuk pengujian berbasis aplikasi di iOS atau pengujian UI di platform mana pun, Bazel akan mem-build output pengujian, tetapi pengujian harus dijalankan dalam Xcode melalui project yang dibuat dengan Tulsi. Tambahkan target pengujian sebagai berikut:
macos_unit_testuntuk menjalankan pengujian unit berbasis library dan berbasis aplikasi di macOS.ios_unit_testuntuk menjalankan pengujian unit berbasis library di iOS. Untuk pengujian yang memerlukan simulator iOS, Bazel akan mem-build output pengujian, tetapi tidak menjalankan pengujian. Anda harus membuat project Xcode dengan Tulsi dan menjalankan pengujian dari dalam Xcode.ios_ui_testuntuk 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 pengemasan lainnya, seperti bundle_identifier dan infoplists, ditetapkan secara default ke nilai yang paling umum digunakan, pastikan default tersebut kompatibel dengan project dan sesuaikan jika perlu. Untuk pengujian yang memerlukan simulator iOS, tentukan juga nama target ios_application sebagai nilai atribut test_host.
Langkah 3c: Tambahkan target library
Tambahkan objc_library
target untuk setiap library Objective C dan swift_library
target untuk setiap library Swift yang menjadi dependensi 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 dalam 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 build yang lebih terperinci
Jika project berukuran besar, atau saat project berkembang, pertimbangkan untuk membaginya menjadi beberapa paket Bazel. Peningkatan detail ini memberikan:
Peningkatan inkrementalitas build,
Peningkatan paralelisme tugas build,
Kemudahan pemeliharaan yang lebih baik untuk pengguna di masa mendatang,
Kontrol yang lebih baik atas visibilitas kode sumber di seluruh target dan paket. Hal ini mencegah masalah seperti library yang berisi detail implementasi bocor ke API publik.
Tips untuk membuat project lebih terperinci:
Tempatkan setiap library dalam paket Bazel-nya sendiri. Mulai dengan library yang memerlukan dependensi paling sedikit dan lanjutkan ke hierarki dependensi.
Saat Anda menambahkan file
BUILDdan menentukan target, tambahkan target baru ini ke atributdepsdari target yang bergantung padanya.Fungsi
glob()tidak melintasi batas paket, sehingga saat jumlah paket bertambah, file yang cocok denganglob()akan berkurang.Saat menambahkan file
BUILDke direktorimain, tambahkan juga fileBUILDke direktoritestyang sesuai.Terapkan batas visibilitas yang sehat di seluruh paket.
Build project setelah setiap perubahan besar pada file
BUILDdan perbaiki error build saat Anda menemukannya.
Langkah 5: Jalankan build
Jalankan build yang sepenuhnya dimigrasikan untuk memastikan build selesai tanpa error atau peringatan. Jalankan setiap target aplikasi dan pengujian satu per satu untuk lebih mudah menemukan sumber error yang terjadi.
Contoh:
bazel build //:my-targetLangkah 6: Buat project Xcode dengan Tulsi
Saat mem-build dengan Bazel, file WORKSPACE dan BUILD akan menjadi sumber kebenaran tentang build. Agar Xcode mengetahui hal ini, Anda harus membuat project Xcode yang kompatibel dengan Bazel menggunakan Tulsi.
Pemecahan masalah
Error Bazel dapat muncul saat Bazel 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 specified to use an Apple CROSSTOOL".
Jalankan Xcode secara manual dan setujui persyaratan dan ketentuan apa pun.
Gunakan Xcode select untuk menunjukkan versi yang benar, menyetujui lisensi, dan menghapus status Bazel.
sudo xcode-select -s /Applications/Xcode.app/Contents/Developersudo xcodebuild -licensebazel sync --configure
- Jika tidak berhasil, Anda juga dapat mencoba menjalankan
bazel clean --expunge.