Bermigrasi dari Xcode ke Bazel

Laporkan masalah Lihat sumber Per malam · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Halaman ini menjelaskan cara membangun atau menguji project Xcode dengan Bazel. Ini menjelaskan perbedaan antara Xcode dan Bazel, dan memberikan langkah-langkah untuk mengonversi proyek Xcode ke proyek Bazel. Juga menyediakan pemecahan masalah solusi untuk mengatasi kesalahan yang umum terjadi.

Perbedaan antara Xcode dan Bazel

  • Bazel mengharuskan Anda untuk menentukan setiap target versi dan setiap target dependensi, ditambah setelan build yang sesuai melalui aturan build.

  • Bazel membutuhkan semua file yang menjadi dependensi proyek direktori ruang kerja atau ditentukan sebagai dependensi dalam MODULE.bazel .

  • Saat membangun project Xcode dengan Bazel, file BUILD akan menjadi yang sesungguhnya. Jika Anda mengerjakan proyek 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 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 familier dengan Bazel dan konsepnya, selesaikan aplikasi iOS tutorial). Anda harus memahami ruang kerja Bazel, termasuk file MODULE.bazel 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 untuk secara eksplisit mendeklarasikan semua dependensi untuk setiap target dalam file BUILD.

Untuk informasi selengkapnya tentang dependensi eksternal, lihat Bekerja dengan dependensi.

Membangun atau menguji project Xcode dengan Bazel

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

  1. Membuat file MODULE.bazel

  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 MODULE.bazel

Buat file MODULE.bazel di direktori baru. Direktori ini menjadi Root ruang kerja Bazel. Jika project tidak menggunakan dependensi eksternal, file ini boleh kosong. Jika proyek tergantung pada file atau paket yang tidak ada di salah satu dalam direktori proyek, tentukan dependensi eksternal ini di File MODULE.bazel.

Langkah 2: (Eksperimental) Integrasikan dependensi SwiftPM

Untuk mengintegrasikan dependensi SwiftPM ke dalam ruang kerja Bazel dengan swift_bazel, Anda harus mengonversinya ke dalam paket Bazel seperti dijelaskan dalam ini kami.

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 BUILD di root ruang kerja Bazel dan konfigurasikan untuk melakukan pembuatan awal project sebagai berikut:

Tips: Untuk mempelajari lebih lanjut paket dan konsep Bazel lainnya, lihat Ruang kerja, paket, dan target.

Langkah 3a: Tambahkan target aplikasi

Tambahkan macos_application atau ios_application target aturan. Target ini masing-masing mem-build paket aplikasi macOS atau iOS. Pada target, tentukan minimal hal berikut:

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

  • provisioning_profile - profil penyediaan dari Apple Developer Anda (jika membuat 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 yang didukung aplikasi Google. Hal ini memastikan Bazel membangun aplikasi dengan level API yang benar.

Langkah 3b: (Opsional) Tambahkan target pengujian

Build Apple Bazel mendukung aturan berjalan unit dan UI pengujian di semua platform Apple. Tambahkan target pengujian sebagai berikut:

  • macos_unit_test untuk menjalankan pengujian unit berbasis library dan aplikasi di macOS.

  • ios_unit_test untuk membuat dan menjalankan pengujian unit berbasis library di iOS.

  • ios_ui_test untuk membuat dan menjalankan pengujian antarmuka pengguna di simulator iOS.

  • Ada aturan pengujian yang serupa untuk tvOS, watchOS dan visionOS.

Setidaknya, tentukan nilai untuk atribut minimum_os_version. Meskipun atribut paket lainnya, seperti bundle_identifier dan infoplists, secara default ke nilai yang paling umum digunakan, pastikan nilai default tersebut kompatibel dengan proyek dan menyesuaikannya bila diperlukan. Untuk pengujian yang memerlukan iOS khusus, 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 swift_library target untuk setiap library Swift yang menjadi dependensi aplikasi dan/atau pengujian.

Tambahkan target library sebagai berikut:

  • Menambahkan target library aplikasi sebagai dependensi ke aplikasi target.

  • Tambahkan target library pengujian sebagai dependensi ke target pengujian.

  • Cantumkan sumber penerapan dalam atribut srcs.

  • Cantumkan header dalam atribut hdrs.

Anda dapat langsung menelusuri contoh yang ada untuk berbagai jenis aplikasi contoh rules_apple direktori. 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 proyek tersebut 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. Ini mencegah masalah seperti library yang berisi detail implementasi yang bocor menjadi API publik.

Kiat untuk merinci proyek:

  • Masukkan setiap library ke dalam paket Bazel-nya sendiri. Mulailah dengan yang membutuhkan dependensi paling sedikit dan naik ke atas dalam hierarki dependensi.

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

  • Fungsi glob() tidak melewati batas paket, sehingga jumlah paket meningkatkan 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 build {i>error<i} saat Anda mengalaminya.

Langkah 5: Jalankan build

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

Contoh:

bazel build //:my-target

Langkah 6: Buat project Xcode dengan rules_xcodeproj

Saat mem-build dengan Bazel, file MODULE.bazel dan BUILD menjadi sumber yang tepercaya tentang build tersebut. Agar Xcode mengetahui hal ini, Anda harus membuat menggunakan project Xcode yang kompatibel dengan Bazel rules_xcodeproj kami.

Pemecahan masalah

{i>Error<i} Bazel bisa muncul ketika tidak sinkron dengan versi Xcode yang dipilih, seperti ketika Anda menerapkan pembaruan. Berikut adalah beberapa hal yang perlu Anda coba jika mengalami kesalahan dengan Xcode, misalnya "Versi Xcode harus ditentukan untuk menggunakan Apple CROSSTOOL".

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

  • Gunakan opsi Xcode untuk menunjukkan versi yang benar, menerima lisensi, dan kondisi 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.