Bazel membangun perangkat lunak dari kode sumber yang tersusun dalam pohon direktori yang disebut
ruang kerja. File sumber di ruang kerja diatur dalam hierarki
paket bertingkat, dengan setiap paket adalah direktori yang berisi kumpulan
file sumber terkait dan satu file BUILD
. File BUILD
menentukan output software
yang dapat dibuat dari sumbernya.
Workspace
Ruang kerja adalah hierarki direktori pada sistem file yang berisi file
sumber untuk software yang ingin Anda bangun. Setiap ruang kerja memiliki file teks bernama
WORKSPACE
yang mungkin kosong, atau mungkin berisi referensi ke
dependensi eksternal yang diperlukan untuk membuat output.
Direktori yang berisi file bernama WORKSPACE
dianggap sebagai root dari
ruang kerja. Oleh karena itu, Bazel mengabaikan semua hierarki direktori di ruang kerja yang di-root
pada subdirektori yang berisi file WORKSPACE
karena membentuk ruang kerja lain.
Bazel juga mendukung file WORKSPACE.bazel
sebagai alias dari file WORKSPACE
.
Jika kedua file ada, WORKSPACE.bazel
digunakan.
Repositori
Kode diatur di dalam repositori. Direktori yang berisi file WORKSPACE
adalah root repositori utama, juga disebut @
. Repositori (eksternal) lainnya
ditentukan dalam file WORKSPACE
menggunakan aturan ruang kerja.
Aturan ruang kerja yang dipaketkan dengan Bazel didokumentasikan di bagian Aturan Workspace di Build Encyclopedia dan dokumentasi tentang aturan repositori Starlark yang disematkan.
Karena repositori eksternal adalah repositori itu sendiri, repositori ini sering kali juga berisi file WORKSPACE
. Namun, file WORKSPACE
tambahan ini
diabaikan oleh Bazel. Secara khusus, repositori yang bergantung pada secara transitif tidak akan ditambahkan secara otomatis.
Paket
Unit utama organisasi kode dalam repositori adalah paket. Paket adalah kumpulan file terkait dan spesifikasi cara penggunaannya untuk menghasilkan artefak output.
Paket didefinisikan sebagai direktori yang berisi file bernama BUILD
(atau BUILD.bazel
). Paket mencakup semua file dalam direktorinya, serta
semua subdirektori di bawahnya, kecuali yang berisi file
BUILD
. Dari definisi ini, tidak ada file atau direktori yang dapat menjadi bagian dari
dua paket berbeda.
Misalnya, dalam hierarki direktori berikut,
ada dua paket, my/app
, dan sub-paket my/app/tests
.
Perlu diketahui bahwa my/app/data
bukanlah paket, melainkan direktori
yang termasuk dalam 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
Targets
Paket adalah container target, yang ditentukan dalam file
BUILD
paket. Sebagian besar target adalah salah satu dari dua jenis utama, yaitu file dan aturan.
File dibagi lagi menjadi dua jenis. File sumber biasanya ditulis oleh pengguna, dan di-check in ke repositori. File yang dihasilkan, terkadang disebut file turunan atau file output, tidak di-check in, tetapi dihasilkan dari file sumber.
Jenis target kedua dideklarasikan dengan aturan. Setiap instance aturan menentukan hubungan antara satu set input dan satu set file output. Input ke aturan dapat berupa file sumber, tetapi juga dapat berupa output aturan lainnya.
Apakah input ke aturan berupa file sumber atau file yang dihasilkan umumnya tidak penting; yang penting hanyalah konten file tersebut. Hal 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 sangat merepotkan, dan seseorang menulis program untuk mendapatkannya. Tidak ada perubahan yang diperlukan untuk pemakai file tersebut. Sebaliknya, file yang dihasilkan dapat dengan mudah diganti oleh file sumber dengan perubahan lokal saja.
Input ke aturan juga dapat mencakup aturan lainnya. Makna akurat 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 dari 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 dari semua aturan adalah file yang dihasilkan oleh aturan selalu menjadi bagian dari paket yang sama dengan aturan itu sendiri; file tidak dapat dihasilkan ke paket lain. Meskipun tidak jarang input aturan berasal dari paket lain.
Grup paket adalah kumpulan paket yang tujuannya adalah membatasi aksesibilitas
aturan tertentu. Grup paket ditentukan oleh fungsi package_group
.
Objek tersebut memiliki tiga properti: daftar paket yang ada di dalamnya, namanya, dan grup paket lainnya yang disertakan. Satu-satunya cara yang diizinkan untuk merujuknya adalah
dari atribut visibility
aturan atau dari atribut default_visibility
fungsi package
; cara tersebut tidak membuat atau menggunakan file.
Untuk informasi selengkapnya, lihat dokumentasi package_group
.