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 lanjutan:
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. Opsi ini berguna jika file BUILD
menjadi terlalu berulang atau terlalu rumit, karena memungkinkan Anda 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. Ia dapat mengakses internal Bazel dan memiliki kendali penuh atas apa yang terjadi. Misalnya, hal ini dapat meneruskan informasi ke aturan lain.
Jika Anda ingin menggunakan kembali logika sederhana, mulai dengan makro. Jika makro menjadi kompleks, sering kali merupakan ide yang baik untuk menjadikannya 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 sudah 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 tersebut akan ditambahkan ke grafik). Di sinilah makro dievaluasi.Fase Analisis. Kode aturan dijalankan (fungsi
implementation
-nya), dan tindakan dibuat instance-nya. Tindakan menjelaskan cara menghasilkan satu set output dari serangkaian 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 akan dijalankan jika setidaknya salah satu output-nya 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 sekali per build dan hasil evaluasi
di-cache dan digunakan kembali. File hanya dievaluasi setelah semua dependensinya (pernyataan
load()
) diselesaikan. Menurut desain, pemuatan file .bzl
tidak memiliki efek samping
yang terlihat, yang hanya menentukan nilai dan fungsi.
Bazel mencoba untuk bersikap cerdas: penggunaan analisis dependensi untuk mengetahui file mana yang harus dimuat, aturan mana yang harus dianalisis, dan tindakan mana yang harus dijalankan. Misalnya, jika sebuah aturan menghasilkan tindakan yang tidak Anda perlukan untuk build saat ini, aturan tersebut tidak akan dijalankan.
Membuat ekstensi
Buat makro pertama Anda untuk menggunakan kembali beberapa kode. Kemudian, pelajari makro lebih lanjut dan menggunakannya untuk membuat "kata kerja kustom".
Ikuti tutorial aturan untuk mulai menggunakan aturan. Selanjutnya, Anda dapat membaca lebih lanjut tentang konsep aturan.
Dua tautan di bawah ini akan sangat berguna saat menulis ekstensi Anda sendiri. Pastikan mereka dalam jangkauan:
Lebih jauh
Selain makro dan aturan, Anda dapat 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 ke pengguna lain.