Halaman ini menjelaskan cara memperluas bahasa BUILD menggunakan makro dan aturan.
Ekstensi Bazel adalah file yang berakhiran .bzl
. Gunakan
pernyataan pemuatan untuk mengimpor simbol dari ekstensi.
Sebelum mempelajari konsep yang lebih canggih, pertama:
Baca tentang bahasa Starlark, yang digunakan dalam file
BUILD
dan.bzl
.Pelajari cara membagikan variabel antara dua file
BUILD
.
Makro dan aturan
Makro adalah fungsi yang membuat instance aturan. Makro terdiri dari dua jenis:
makro simbolis (baru di Bazel 8) dan makro
lama. Kedua jenis makro ditentukan
secara berbeda, tetapi berperilaku hampir sama dari sudut pandang pengguna. Makro
berguna saat file BUILD
menjadi terlalu berulang atau terlalu rumit, karena
makro memungkinkan Anda menggunakan kembali beberapa kode. Fungsi dievaluasi segera setelah file BUILD
dibaca. Setelah evaluasi file BUILD
, Bazel memiliki sedikit informasi tentang makro. Jika makro Anda menghasilkan genrule
, Bazel akan berperilaku hampir seolah-olah Anda mendeklarasikan genrule
tersebut dalam file BUILD
. (Satu-satunya
pengecualian adalah bahwa target yang dideklarasikan dalam makro simbolik memiliki semantik visibilitas khusus: makro simbolik dapat menyembunyikan target internalnya
dari paket lainnya.)
Aturan lebih canggih daripada makro. Dapat mengakses internal Bazel dan memiliki kontrol penuh atas apa yang terjadi. Misalnya, aturan ini dapat meneruskan informasi ke aturan lain.
Jika Anda ingin menggunakan kembali logika sederhana, mulailah dengan makro; sebaiknya gunakan makro simbolik, kecuali jika Anda perlu mendukung versi Bazel yang lebih lama. Jika makro menjadi rumit, sebaiknya jadikan makro tersebut sebagai aturan. Dukungan untuk bahasa baru biasanya dilakukan dengan aturan. Aturan ditujukan untuk pengguna tingkat lanjut, dan sebagian besar pengguna tidak perlu menulis aturan; mereka hanya akan memuat dan memanggil aturan yang ada.
Model evaluasi
Build terdiri dari tiga fase.
Fase pemuatan. Pertama, muat dan evaluasi semua ekstensi dan semua file
BUILD
yang diperlukan untuk build. Eksekusi fileBUILD
hanya meng-instansiasi aturan (setiap kali aturan dipanggil, aturan tersebut ditambahkan ke grafik). Di sinilah makro dievaluasi.Fase analisis. Kode aturan dijalankan (fungsi
implementation
-nya), dan tindakan di-instansiasi. Tindakan menjelaskan cara membuat sekumpulan output dari sekumpulan input, seperti "jalankan gcc di hello.c dan dapatkan hello.o". Anda harus mencantumkan secara eksplisit file mana yang akan dibuat sebelum menjalankan perintah sebenarnya. Dengan kata lain, fase analisis mengambil grafik yang dihasilkan oleh fase pemuatan dan menghasilkan grafik tindakan.Fase eksekusi. Tindakan dijalankan, jika setidaknya salah satu outputnya diperlukan. Jika file tidak ada atau jika perintah gagal menghasilkan satu output, build akan gagal. Pengujian juga dijalankan selama fase ini.
Bazel menggunakan paralelisme untuk membaca, mengurai, dan mengevaluasi file .bzl
dan file BUILD
. File dibaca paling banyak satu kali per build dan hasil evaluasi di-cache dan digunakan kembali. File hanya dievaluasi setelah semua dependensinya (pernyataan load()
) diselesaikan. Secara desain, memuat file .bzl
tidak memiliki efek samping yang terlihat, hanya menentukan nilai dan fungsi.
Bazel mencoba menjadi pintar: Bazel menggunakan analisis dependensi untuk mengetahui file mana yang harus dimuat, aturan mana yang harus dianalisis, dan tindakan mana yang harus dieksekusi. Misalnya, jika aturan menghasilkan tindakan yang tidak Anda perlukan untuk build saat ini, tindakan tersebut tidak akan dieksekusi.
Membuat ekstensi
Buat makro pertama Anda untuk menggunakan kembali beberapa kode. Kemudian, pelajari lebih lanjut makro dan cara menggunakannya untuk membuat "kata kerja kustom".
Ikuti tutorial aturan untuk mulai menggunakan aturan. Selanjutnya, Anda dapat membaca lebih lanjut konsep aturan.
Dua link di bawah ini akan sangat berguna saat menulis ekstensi Anda sendiri. Simpan di tempat yang mudah dijangkau:
Melangkah lebih jauh
Selain makro dan aturan, Anda mungkin ingin menulis aspek dan aturan repositori.
Gunakan Buildifier secara konsisten untuk memformat dan melakukan lint pada kode Anda.
Ikuti panduan gaya
.bzl
.Uji kode Anda.
Buat dokumentasi untuk membantu pengguna Anda.
Optimalkan performa kode Anda.
Deploy ekstensi Anda kepada orang lain.