Bazel membangun software dari kode sumber yang disusun dalam hierarki direktori yang disebut repositori. Kumpulan repositori yang ditentukan membentuk ruang kerja. File
sumber dalam repositori disusun dalam hierarki paket bertingkat, di mana
setiap paket adalah direktori yang berisi sekumpulan file sumber terkait dan satu
file BUILD
. File BUILD
menentukan output software apa yang dapat dibuat dari
sumber.
Repositori
File sumber yang digunakan dalam build Bazel diatur dalam repositori (sering kali disingkat menjadi repos). Repo adalah hierarki direktori dengan file penanda batas di
root-nya; file penanda batas tersebut dapat berupa MODULE.bazel
, REPO.bazel
, atau
dalam konteks lama, WORKSPACE
atau WORKSPACE.bazel
.
Repo tempat perintah Bazel saat ini dijalankan disebut repo utama. Repo lain (eksternal) ditentukan oleh aturan repo; lihat ringkasan dependensi eksternal untuk mengetahui informasi selengkapnya.
Ruang kerja
Ruang kerja adalah lingkungan yang digunakan bersama oleh semua perintah Bazel yang dijalankan dari repo utama yang sama. Repositori ini mencakup repo utama dan kumpulan semua repo eksternal yang ditentukan.
Perhatikan bahwa secara historis konsep "repositori" dan "ruang kerja" telah disamakan; istilah "ruang kerja" sering digunakan untuk merujuk ke repositori utama, dan terkadang bahkan digunakan sebagai sinonim dari "repositori".
Paket
Unit utama organisasi kode dalam repositori adalah paket. Paket adalah kumpulan file terkait dan spesifikasi tentang cara file tersebut dapat digunakan untuk menghasilkan artefak output.
Paket ditentukan sebagai direktori yang berisi
file BUILD
yang diberi nama BUILD
atau BUILD.bazel
. Paket mencakup semua file di direktorinya, ditambah semua subdirektori di bawahnya, kecuali yang berisi file BUILD
. Berdasarkan definisi ini, tidak ada file atau direktori yang boleh menjadi bagian dari dua paket berbeda.
Misalnya, dalam struktur direktori berikut, ada dua paket, my/app
, dan subpaket my/app/tests
. Perhatikan bahwa my/app/data
bukan paket, tetapi
direktori milik paket my/app
.
src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc
Target
Paket adalah penampung target, yang ditentukan dalam file
BUILD
paket. Sebagian besar target adalah salah satu dari dua jenis utama, file dan aturan.
File selanjutnya dibagi menjadi dua jenis. File sumber biasanya ditulis oleh upaya orang-orang, dan di-check in ke repositori. File yang dibuat, terkadang disebut file turunan atau file output, tidak di-check in, tetapi dibuat dari file sumber.
Jenis target kedua dideklarasikan dengan rule. Setiap instance aturan menentukan hubungan antara sekumpulan file input dan sekumpulan file output. Input untuk aturan dapat berupa file sumber, tetapi juga dapat berupa output dari aturan lain.
Apakah input ke aturan adalah file sumber atau file yang dihasilkan, dalam sebagian besar kasus tidaklah penting; yang penting hanyalah isi file tersebut. Fakta ini memudahkan penggantian file sumber yang kompleks dengan file yang dihasilkan oleh aturan, seperti yang terjadi saat beban pemeliharaan file yang sangat terstruktur secara manual menjadi terlalu melelahkan, dan seseorang menulis program untuk mendapatkannya. Tidak ada perubahan yang diperlukan pada konsumen file tersebut. Sebaliknya, file yang dibuat dapat dengan mudah diganti dengan file sumber yang hanya memiliki perubahan lokal.
Input ke suatu aturan juga dapat mencakup aturan lain. Makna yang tepat dari hubungan tersebut sering kali cukup kompleks dan bergantung pada bahasa atau aturan, tetapi secara intuitif, hal ini sederhana: aturan library C++ A mungkin memiliki aturan library C++ B lain untuk input. Efek dependensi ini adalah file header B tersedia untuk A selama kompilasi, simbol B tersedia untuk A selama penautan, dan data runtime B tersedia untuk A selama eksekusi.
Invarian semua aturan adalah bahwa file yang dibuat oleh aturan selalu termasuk dalam paket yang sama dengan aturan itu sendiri; file tidak dapat dibuat ke dalam paket lain. Namun, input aturan sering kali berasal dari paket lain.
Grup paket adalah kumpulan paket yang tujuannya adalah untuk membatasi aksesibilitas
aturan tertentu. Grup paket ditentukan oleh fungsi package_group
. Paket
memiliki tiga properti: daftar paket yang dikandungnya, namanya, dan grup
paket lain yang disertakannya. Satu-satunya cara yang diizinkan untuk merujuknya adalah dari atribut
visibility
aturan atau dari atribut default_visibility
fungsi
package
; fungsi ini tidak membuat atau menggunakan file. Untuk mengetahui informasi selengkapnya, lihat dokumentasi package_group
.