Halaman ini menjelaskan cara mengoptimalkan performa build Bazel saat menjalankan Bazel berulang kali.
Status Runtime Bazel
Pemanggilan Bazel melibatkan beberapa bagian yang berinteraksi.
Antarmuka command line (CLI)
bazel
adalah alat front-end yang dilihat pengguna dan menerima perintah dari pengguna.Alat CLI memulai server Bazel untuk setiap basis output yang berbeda. Server Bazel umumnya bersifat persisten, tetapi akan dimatikan setelah beberapa waktu tidak ada aktivitas agar tidak menyia-nyiakan resource.
Server Bazel melakukan langkah pemuatan dan analisis untuk perintah tertentu (
build
,run
,cquery
, dll.), tempat server Bazel membuat bagian yang diperlukan dari grafik build dalam memori. Struktur data yang dihasilkan disimpan di server Bazel sebagai bagian dari cache analisis.Server Bazel juga dapat melakukan eksekusi tindakan, atau dapat mengirimkan tindakan untuk eksekusi jarak jauh jika disiapkan untuk melakukannya. Hasil eksekusi tindakan juga akan di-cache, yaitu dalam cache tindakan (atau cache eksekusi, yang dapat bersifat lokal atau jarak jauh, dan dapat dibagikan di antara server Bazel).
Hasil pemanggilan Bazel tersedia di hierarki output.
Menjalankan Bazel Secara Berulang
Dalam alur kerja developer umum, membuat (atau menjalankan) potongan kode
berulang kali, sering kali dengan frekuensi yang sangat tinggi (misalnya untuk menyelesaikan beberapa error
kompilasi atau menyelidiki pengujian yang gagal). Dalam situasi ini, pemanggilan bazel
yang berulang harus memiliki overhead yang seminimal mungkin sehubungan dengan tindakan berulang yang mendasarinya (misalnya memanggil compiler, atau menjalankan pengujian).
Dengan mempertimbangkan hal ini, kita akan membahas kembali status runtime Bazel:
{i>Cache<i} analisis adalah bagian penting dari data. Sejumlah waktu dapat dihabiskan hanya pada fase pemuatan dan analisis dari cold run (yaitu run tepat setelah server Bazel dimulai atau saat cache analisis dihapus). Untuk satu cold build yang berhasil (misalnya, untuk rilis produksi), biaya ini cukup tertahan, tetapi untuk membangun target yang sama berulang kali, biaya ini harus diamortisasi dan tidak diulang pada setiap pemanggilan.
Cache analisis tidak stabil. Pertama, ini adalah bagian dari status dalam proses
server Bazel, sehingga kehilangan server akan kehilangan cache. Namun, cache
juga dibatalkan dengan sangat mudah: misalnya, banyak tanda command line bazel
menyebabkan cache dihapus. Hal ini karena banyak flag memengaruhi grafik
build (misalnya karena
atribut yang dapat dikonfigurasi). Beberapa perubahan
flag juga dapat menyebabkan server Bazel dimulai ulang (mis. mengubah
opsi memulai).
Cache eksekusi yang baik juga sangat penting untuk performa build. Cache eksekusi dapat disimpan secara lokal di disk atau dari jarak jauh. Cache dapat dibagikan antar server Bazel, dan juga di antara developer.
Menghindari penghapusan cache analisis
Bazel akan mencetak peringatan jika cache analisis dihapus atau server dimulai ulang. Salah satu dari hal berikut harus dihindari selama penggunaan iteratif:
Pertimbangkan untuk mengubah flag
bazel
di tengah alur kerja iteratif. Misalnya, menggabungkanbazel build -c opt
denganbazel cquery
akan menyebabkan setiap perintah menghapus cache analisis yang lainnya. Secara umum, coba gunakan kumpulan flag tetap selama durasi alur kerja tertentu.Kehilangan server Bazel akan kehilangan cache analisis. Server Bazel memiliki waktu tidak ada aktivitas yang dapat dikonfigurasi, dan setelah itu server akan dimatikan. Anda dapat mengonfigurasi kali ini melalui file Bazelrc agar sesuai dengan kebutuhan Anda. Server juga dimulai ulang saat flag startup berubah. Jadi, sekali lagi, hindari mengubah flag tersebut jika memungkinkan.
Hati-hati bahwa server Bazel akan dihentikan jika Anda menekan Ctrl-C berulang kali saat Bazel sedang berjalan. Anda mungkin ingin mencoba menghemat waktu dengan mengganggu build yang sedang berjalan yang tidak lagi diperlukan, tetapi cukup tekan Ctrl-C satu kali untuk meminta akhir yang baik dari pemanggilan saat ini.
Jika ingin menggunakan beberapa kumpulan tanda dari ruang kerja yang sama, Anda dapat menggunakan beberapa basis output yang berbeda dan dialihkan dengan tanda
--output_base
. Setiap basis output mendapatkan server Bazel-nya sendiri.