Halaman ini menjelaskan cara memperluas bahasa BUILD menggunakan makro dan aturan.
Ekstensi Bazel adalah file yang diakhiri dengan .bzl
. Gunakan pernyataan pemuatan untuk mengimpor simbol dari ekstensi.
Sebelum mempelajari konsep lanjutan, pertama:
Baca 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. Hal ini berguna saat
file BUILD
terlalu repetitif atau terlalu kompleks, karena memungkinkan Anda untuk menggunakan kembali
beberapa kode. Fungsi ini dievaluasi segera setelah file BUILD
dibaca. Setelah
evaluasi file BUILD
, Bazel memiliki sedikit informasi tentang makro:
jika makro Anda menghasilkan genrule
, Bazel akan berperilaku seolah-olah Anda menulis
genrule
. Akibatnya, bazel query
hanya akan mencantumkan genrule
yang dihasilkan.
Aturan lebih efektif daripada makro. Aplikasi ini dapat mengakses internal Bazel dan memiliki kontrol penuh atas apa yang sedang terjadi. Misalnya, kunci ini dapat meneruskan informasi ke aturan lain.
Jika Anda ingin menggunakan kembali logika sederhana, mulailah dengan makro. Jika makro menjadi kompleks, sering kali Anda sebaiknya menjadikannya sebagai aturan. Dukungan untuk bahasa baru biasanya dilakukan dengan aturan. Aturan ditujukan untuk pengguna tingkat lanjut, dan sebagian besar pengguna tidak perlu menulisnya; 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 membuat instance aturan (setiap kali aturan dipanggil, aturan akan ditambahkan ke grafik). Di sinilah makro dievaluasi.Fase analisis. Kode aturan dieksekusi (fungsi
implementation
-nya) dan tindakan dibuat instance-nya. Tindakan menjelaskan cara menghasilkan serangkaian 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, saat setidaknya salah satu outputnya diperlukan. Jika file tidak ada atau perintah gagal menghasilkan satu output, build akan gagal. Pengujian juga dijalankan selama fase ini.
Bazel menggunakan paralelisme untuk membaca, mengurai, dan mengevaluasi file .bzl
serta file
BUILD
. File dibaca maksimal sekali per build dan hasil evaluasi di-cache dan digunakan kembali. File dievaluasi hanya setelah semua dependensinya (pernyataan load()
) diselesaikan. Secara desain, memuat file .bzl
tidak memiliki efek samping yang terlihat, file ini hanya menentukan nilai dan fungsi.
Bazel mencoba menjadi pintar: analisis 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 diperlukan untuk build saat ini, aturan tersebut tidak akan dieksekusi.
Membuat ekstensi
Buat makro pertama Anda untuk menggunakan kembali beberapa kode. Kemudian, pelajari makro lebih lanjut dan penggunaannya untuk membuat "kata kerja kustom".
Ikuti tutorial aturan untuk memulai aturan. Selanjutnya, Anda dapat membaca selengkapnya tentang konsep aturan.
Kedua tautan di bawah akan sangat berguna saat menulis ekstensi Anda sendiri. Buat agar tetap berada dalam jangkauan:
Lebih jauh
Selain makro dan aturan, sebaiknya Anda menulis aspek dan aturan repositori.
Gunakan Buildifier secara konsisten untuk memformat dan membuat lint kode Anda.
Ikuti panduan gaya
.bzl
.Uji kode Anda.
Buat dokumentasi untuk membantu pengguna.
Mengoptimalkan performa kode.
Deploy ekstensi Anda ke orang lain.