Halaman ini menjelaskan cara memperluas bahasa BUILD menggunakan makro dan aturan.
Ekstensi Bazel adalah file yang berakhiran .bzl
. Gunakan
load statement untuk mengimpor simbol dari ekstensi.
Sebelum mempelajari konsep lanjutan:
Baca tentang bahasa Starlark, yang digunakan dalam File
BUILD
dan.bzl
.Pelajari cara membagikan variabel di antara dua file
BUILD
.
Makro dan aturan
Makro adalah fungsi yang membuat instance aturan. Hal ini berguna ketika
File BUILD
menjadi terlalu berulang atau terlalu rumit, karena memungkinkan Anda menggunakan kembali
beberapa kode. Fungsi ini dievaluasi segera setelah file BUILD
dibaca. Sesudah
saat mengevaluasi file BUILD
, Bazel hanya memiliki sedikit informasi tentang makro:
jika makro menghasilkan genrule
, Bazel akan berperilaku seolah-olah Anda menulis
genrule
. Akibatnya, bazel query
hanya akan mencantumkan genrule
yang dihasilkan.
Aturan lebih efektif daripada makro. Perangkat dapat mengakses Bazel internal dan memiliki kendali penuh atas apa yang sedang terjadi. Misalnya, lulus informasi ke aturan lain.
Jika Anda ingin menggunakan kembali logika sederhana, mulai dengan makro. Jika sebuah makro menjadi rumit, sering kali merupakan ide yang baik untuk menjadikannya sebagai aturan. Dukungan untuk bahasa baru biasanya dilakukan dengan sebuah aturan. Aturan ditujukan untuk pengguna tingkat lanjut, dan sebagian besar pengguna tidak perlu menulisnya; mereka hanya akan memuat dan memanggil aturan.
Model evaluasi
Build terdiri dari tiga fase.
Fase pemuatan. Pertama, muat dan evaluasi semua ekstensi serta semua
BUILD
file yang dibutuhkan untuk build. Eksekusi fileBUILD
cukup membuat instance aturan (setiap kali aturan dipanggil, aturan tersebut ditambahkan ke grafik). Di sinilah makro dievaluasi.Fase Analisis. Kode aturan dijalankan (
implementation
-nya ), dan tindakan dibuat instance-nya. Sebuah tindakan menjelaskan cara menghasilkan satu set {i>output<i} dari satu set input, seperti "jalankan gcc pada hello.c dan dapatkan hello.o". Anda harus mencantumkan secara eksplisit file mana yang akan dibuat sebelum menjalankan perintah yang sebenarnya. Dengan kata lain, fase analisis mengambil grafik yang dihasilkan oleh fase pemuatan dan menghasilkan grafik tindakan.Fase eksekusi. Tindakan dijalankan, ketika setidaknya salah satu {i>output-<i}nya tidak diperlukan. Jika file hilang atau jika perintah gagal menghasilkan satu {i>output<i}, build tersebut gagal. Pengujian juga dijalankan selama fase ini.
Bazel menggunakan paralelisme untuk membaca, mengurai, dan mengevaluasi file .bzl
dan BUILD
. Sebuah file dibaca paling banyak sekali per build dan hasil evaluasinya adalah
di-cache dan digunakan kembali. File hanya dievaluasi setelah semua dependensinya (load()
berbeda) telah diselesaikan. Sesuai desain, pemuatan file .bzl
tidak memiliki
efek samping, hanya mendefinisikan nilai dan fungsi.
Bazel mencoba menjadi lebih pintar: ia menggunakan analisis dependensi untuk mengetahui file mana yang dimuat, aturan mana yang harus dianalisis, dan tindakan mana yang harus dijalankan. Sebagai misalnya, jika sebuah aturan menghasilkan tindakan yang tidak Anda perlukan untuk build saat ini, permintaan tersebut tidak akan dieksekusi.
Membuat ekstensi
Buat makro pertama untuk menggunakan kembali beberapa kode. Lalu pelajari lebih lanjut tentang makro 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. Pertahankan mereka dalam jangkauan:
Lebih jauh
Selain makro dan aturan, Anda mungkin ingin menulis aspek dan aturan repositori.
Menggunakan 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.