Bermigrasi dari Xcode ke Bazel

Laporkan masalah Lihat sumber {/18/}{/1/}

Halaman ini menjelaskan cara membangun 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 umum.

Perbedaan antara Xcode dan Bazel

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

  • Bazel mengharuskan semua file yang menjadi tempat project bergantung ada dalam direktori Workspace atau ditentukan sebagai impor dalam file WORKSPACE.

  • Saat membuat project Xcode dengan Bazel, file BUILD akan menjadi sumber tepercaya. Jika mengerjakan project di Xcode, Anda harus membuat versi baru project Xcode yang cocok dengan file BUILD menggunakan rules_xcodeproj setiap kali Anda memperbarui file BUILD. Perubahan tertentu pada file BUILD seperti menambahkan dependensi ke target tidak memerlukan pembuatan ulang project yang dapat mempercepat pengembangan. Jika Anda tidak menggunakan Xcode, perintah bazel build dan bazel test memberikan kemampuan build dan pengujian dengan batasan tertentu yang akan dijelaskan nanti dalam panduan ini.

Sebelum memulai

Sebelum memulai, lakukan hal berikut:

  1. Instal Bazel jika Anda belum melakukannya.

  2. Jika Anda tidak 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 proyek.

Menganalisis dependensi project

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

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

Membangun atau menguji project Xcode dengan Bazel

Untuk membangun atau menguji project Xcode dengan Bazel, lakukan hal berikut:

  1. Membuat file WORKSPACE

  2. (Eksperimental) Mengintegrasikan dependensi SwiftPM

  3. Buat file BUILD:

    a. Menambahkan target aplikasi

    b. (Opsional) Menambahkan target pengujian

    c. Menambahkan target library

  4. (Opsional) Memerinci build

  5. Menjalankan build

  6. Membuat project Xcode dengan rules_xcodeproj

Langkah 1: Buat file WORKSPACE

Buat file WORKSPACE di direktori baru. Direktori ini menjadi {i>root <i} workspace Bazel. Jika project tidak menggunakan dependensi eksternal, file ini bisa 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 SwiftPM

Untuk mengintegrasikan dependensi SwiftPM ke dalam ruang kerja Bazel dengan swift_bazel, Anda harus mengonversinya menjadi paket Bazel seperti yang dijelaskan dalam tutorial berikut.

Langkah 3: Buat file BUILD

Setelah menentukan ruang kerja dan dependensi eksternal, Anda harus membuat file BUILD yang memberi tahu Bazel cara menyusun project. 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 mem-build paket aplikasi macOS atau iOS. Pada target, tentukan minimal hal berikut:

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

  • provisioning_profile - profil penyediaan dari akun Apple Developer (jika membangun aplikasi untuk perangkat iOS).

  • families (khusus iOS) - apakah akan membuat aplikasi untuk iPhone, iPad, atau keduanya.

  • infoplists - daftar file .plist untuk digabungkan ke dalam file Info.plist akhir.

  • minimum_os_version - versi minimum macOS atau iOS yang didukung aplikasi. Hal ini memastikan Bazel membangun aplikasi dengan level 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 pada iOS atau pengujian UI pada salah satu platform, Bazel akan membuat output pengujian, tetapi pengujian harus berjalan dalam Xcode melalui project yang dibuat dengan rules_xcodeproj. 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 membuat output pengujian, tetapi tidak menjalankan pengujian. Anda harus membuat project Xcode dengan rules_xcodeproj dan menjalankan pengujian dari dalam Xcode.

  • ios_ui_test untuk membuat output yang diperlukan untuk menjalankan pengujian antarmuka pengguna di simulator iOS menggunakan Xcode. Anda harus membuat project Xcode dengan rules_xcodeproj dan menjalankan pengujian dari dalam Xcode. Bazel tidak dapat menjalankan pengujian UI secara native.

Setidaknya, 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 nilai 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 digunakan 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 penerapan dalam atribut srcs.

  • Cantumkan header dalam atribut hdrs.

Anda dapat mencari contoh yang ada untuk berbagai jenis aplikasi secara langsung pada direktori contoh aturan_apple. Contoh:

Untuk mengetahui informasi selengkapnya tentang aturan build, lihat Apple Rules untuk Bazel.

Pada tahap ini, sebaiknya uji build:

bazel build //:<application_target>

Langkah 4: (Opsional) Memerinci build

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

  • Peningkatan inkrementalitas build,

  • Peningkatan paralelisasi tugas build,

  • Pengelolaan yang lebih baik untuk pengguna di masa depan,

  • Kontrol yang lebih baik atas visibilitas kode sumber di seluruh target dan paket. Tindakan ini akan mencegah masalah seperti library yang berisi detail implementasi yang bocor ke API publik.

Kiat untuk merinci proyek:

  • Masukkan setiap library ke dalam paket Bazel-nya sendiri. Mulailah dengan dependensi yang paling sedikit, lalu lanjutkan dengan hierarki dependensi.

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

  • Fungsi glob() tidak melewati batas paket sehingga jumlah paket bertambah, file yang cocok dengan glob() akan menyusut.

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

  • Terapkan batas visibilitas yang baik di seluruh paket.

  • Buat 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 target pengujian satu per satu untuk menemukan sumber error yang terjadi dengan lebih mudah.

Contoh:

bazel build //:my-target

Langkah 6: Buat project Xcode dengan rules_xcodeproj

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 rules_xcodeproj.

Pemecahan masalah

Error Bazel dapat muncul jika tidak disinkronkan dengan versi Xcode yang dipilih, seperti saat Anda menerapkan update. Berikut adalah beberapa hal yang harus dicoba jika Anda mengalami error saat menggunakan Xcode, misalnya "Versi Xcode harus ditentukan untuk menggunakan Apple CROSSTOOL".

  • Jalankan Xcode secara manual dan setujui semua persyaratan dan ketentuan.

  • Gunakan Xcode select 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.