Bermigrasi dari Xcode ke Bazel

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

Halaman ini menjelaskan cara mem-build atau menguji project Xcode dengan Bazel. Di sini Anda dapat menjelaskan perbedaan antara Xcode dan Bazel, serta memberikan langkah-langkah untuk mengonversi project Xcode ke project Bazel. Layanan ini juga memberikan solusi pemecahan masalah untuk mengatasi error umum.

Perbedaan antara Xcode dan Bazel

  • Bazel mengharuskan Anda menentukan secara eksplisit setiap target build dan dependensinya, serta setelan build yang sesuai melalui aturan build.

  • Bazel memerlukan semua file yang menjadi dependensi project dalam direktori ruang kerja atau ditentukan sebagai impor dalam file WORKSPACE.

  • Saat membuat project Xcode dengan Bazel, file BUILD akan menjadi sumber kebenaran. Jika mengerjakan project di Xcode, Anda harus membuat versi baru project Xcode yang cocok dengan file BUILD menggunakan Tulsi setiap kali Anda memperbarui file BUILD. Jika Anda tidak menggunakan Xcode, perintah bazel build dan bazel test memberikan kemampuan build dan pengujian dengan batasan tertentu yang dijelaskan nanti dalam panduan ini.

  • Karena perbedaan skema konfigurasi build, seperti tata letak direktori atau tanda build, Xcode mungkin tidak sepenuhnya menyadari "gambar 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, pembersih alamat, dan pembersih thread 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 test secara manual.

Sebelum memulai

Sebelum memulai, lakukan hal berikut ini:

  1. Instal Bazel jika Anda belum melakukannya.

  2. Jika Anda belum terbiasa dengan Bazel dan konsepnya, selesaikan tutorial aplikasi iOS. Anda harus memahami ruang kerja Bazel, termasuk file WORKSPACE dan BUILD, serta konsep target, aturan build, dan paket Bazel.

  3. Menganalisis dan memahami dependensi project.

Menganalisis dependensi project

Tidak seperti Xcode, Bazel mengharuskan Anda mendeklarasikan semua dependensi untuk setiap target dalam file BUILD secara eksplisit.

Untuk informasi selengkapnya tentang dependensi eksternal, lihat Menangani dependensi eksternal.

Membuat atau menguji project Xcode dengan Bazel

Untuk mem-build atau menguji project Xcode dengan Bazel, lakukan hal berikut:

  1. Membuat file WORKSPACE

  2. (Eksperimental) Mengintegrasikan dependensi CocoaPods

  3. Membuat file BUILD:

    a. Menambahkan target aplikasi

    b. (Opsional) Tambahkan target pengujian

    sekitar tahun Menambahkan target library

  4. (Opsional) Perincian build

  5. Menjalankan build

  6. Membuat project Xcode dengan Tulsi

Langkah 1: Buat file WORKSPACE

Buat file WORKSPACE di direktori baru. Direktori ini menjadi root Workspace 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 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 harus membuat file BUILD yang memberi tahu Bazel cara project disusun. Buat file BUILD di root ruang kerja Bazel dan konfigurasikan untuk melakukan build awal project sebagai berikut:

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 masing-masing membuat app bundle macOS atau iOS. Di target, tentukan nilai minimum berikut:

  • bundle_id - ID paket (jalur DNS terbalik diikuti dengan nama aplikasi) biner.

  • provisioning_profile - menyediakan profil dari akun Apple Developer (jika membuat aplikasi untuk perangkat 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 API level yang benar.

Langkah 3b: (Opsional) Tambahkan target pengujian

Aturan build Apple Bazel mendukung pengujian unit berbasis library yang berjalan di iOS dan macOS, serta pengujian berbasis aplikasi di macOS. Untuk pengujian berbasis aplikasi di iOS atau pengujian UI di salah satu platform, Bazel akan mem-build output pengujian, tetapi pengujian harus berjalan 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 pada macOS.

  • ios_unit_test untuk menjalankan pengujian unit berbasis library di iOS. Untuk pengujian yang memerlukan simulator iOS, Bazel akan membuat output pengujian, tetapi tidak menjalankan pengujian. Anda harus membuat project Xcode dengan Tulsi dan menjalankan pengujian dari dalam Xcode.

  • ios_ui_test untuk mem-build output yang diperlukan guna menjalankan pengujian antarmuka pengguna dalam 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.

Setidaknya, tentukan nilai untuk atribut minimum_os_version. Meskipun atribut paket lainnya, seperti bundle_identifier dan infoplists, ditetapkan secara default ke nilai yang paling sering digunakan, pastikan default tersebut kompatibel dengan project dan sesuaikan seperlunya. Untuk pengujian yang memerlukan simulator iOS, tentukan juga nama target ios_application sebagai nilai atribut test_host.

Langkah 3c: Tambahkan target library

Tambahkan target objc_library untuk setiap library Objective C dan target swift_library untuk setiap library Swift tempat aplikasi dan/atau pengujian bergantung.

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 informasi selengkapnya tentang aturan build, lihat Apple Rules for Bazel.

Pada tahap ini, sebaiknya uji build:

bazel build //:<application_target>

Langkah 4: (Opsional) Perincian build

Jika project besar, atau seiring pertumbuhannya, pertimbangkan untuk membaginya menjadi beberapa paket Bazel. Peningkatan perincian ini memberikan:

  • Peningkatan inkrementalitas build,

  • Paralelisasi tugas build meningkat,

  • Kemudahan pemeliharaan yang lebih baik bagi 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 dalam API publik.

Tips untuk memerinci project:

  • Masukkan setiap library ke dalam paket Bazel-nya sendiri. Mulailah dengan dependensi yang memerlukan dependensi paling sedikit dan tingkatkan hierarki dependensi Anda.

  • Saat Anda menambahkan file BUILD dan menentukan target, tambahkan target baru ini ke atribut deps target yang bergantung padanya.

  • Fungsi glob() tidak melampaui batas paket, sehingga seiring bertambahnya jumlah paket, file yang cocok dengan glob() akan menyusut.

  • Saat menambahkan file BUILD ke direktori main, tambahkan juga file BUILD ke direktori test yang sesuai.

  • Menerapkan batas visibilitas yang sehat di seluruh paket.

  • Build project setelah setiap perubahan besar pada file BUILD dan perbaiki error build saat Anda menemukannya.

Langkah 5: Jalankan build

Jalankan build yang dimigrasikan sepenuhnya untuk memastikan build selesai tanpa error atau peringatan. Jalankan setiap aplikasi dan uji target satu per satu untuk menemukan sumber error yang terjadi dengan lebih mudah.

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 mengetahui hal ini, 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 ini beberapa hal yang perlu dicoba jika Anda mengalami error dengan Xcode, misalnya "Versi Xcode harus ditentukan untuk menggunakan Apple CROSSTOOL".

  • Jalankan Xcode secara manual dan setujui persyaratan dan ketentuan apa pun.

  • Gunakan pemilihan Xcode untuk menunjukkan versi yang benar, menyetujui 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.