Bazel membangun software dari kode sumber yang disusun dalam hierarki direktori yang disebut ruang kerja. File sumber di ruang kerja disusun dalam hierarki
paket bertingkat, dengan setiap paket adalah direktori yang berisi serangkaian
file sumber terkait dan satu file BUILD
. File BUILD
menentukan output software yang dapat dibangun dari sumber.
Ruang kerja
Ruang kerja adalah hierarki direktori pada sistem file Anda 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 ruang kerja. Oleh karena itu, Bazel mengabaikan semua struktur direktori di ruang kerja yang berakar
pada subdirektori yang berisi file WORKSPACE
, karena membentuk ruang kerja lain.
Bazel juga mendukung file WORKSPACE.bazel
sebagai alias file WORKSPACE
.
Jika kedua file ada, WORKSPACE.bazel
akan digunakan.
Repositori
Kode disusun dalam repositori. Direktori yang berisi file WORKSPACE
adalah root repositori utama, yang juga disebut @
. Repositori lain (eksternal)
ditentukan dalam file WORKSPACE
menggunakan aturan ruang kerja.
Aturan ruang kerja yang disertakan dengan Bazel didokumentasikan di bagian Workspace Rules dalam Build Encyclopedia dan dokumentasi tentang embedded Starlark repository rules.
Karena repositori eksternal adalah repositori itu sendiri, repositori tersebut sering kali berisi file WORKSPACE
juga. Namun, file WORKSPACE
tambahan ini diabaikan oleh Bazel. Secara khusus, repositori yang bergantung secara transitif tidak ditambahkan secara otomatis.
Paket
Unit utama organisasi kode dalam repositori adalah paket. Paket adalah kumpulan file terkait dan spesifikasi tentang cara menggunakannya untuk menghasilkan artefak output.
Paket ditentukan sebagai direktori yang berisi file bernama BUILD
(atau BUILD.bazel
). Paket mencakup semua file dalam direktorinya, ditambah
semua subdirektori di bawahnya, kecuali yang berisi file
BUILD
. Dari definisi ini, tidak ada file atau direktori yang boleh menjadi bagian dari
dua paket yang 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 ke aturan dapat berupa file sumber, tetapi juga dapat berupa output dari aturan lain.
Apakah input ke suatu aturan adalah file sumber atau file yang dihasilkan, dalam sebagian besar kasus tidak relevan; 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 mempertahankan file yang sangat terstruktur secara manual menjadi terlalu melelahkan, dan seseorang menulis program untuk mendapatkannya. Tidak ada perubahan yang diperlukan untuk 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 rumit 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 semua aturan adalah bahwa file yang dibuat oleh aturan selalu termasuk dalam paket yang sama dengan aturan itu sendiri; tidak mungkin membuat file ke dalam paket lain. Namun, tidak jarang input aturan berasal dari paket lain.
Grup paket adalah sekumpulan paket yang tujuannya adalah untuk membatasi aksesibilitas aturan tertentu. Grup paket ditentukan oleh fungsi package_group
.
Grup ini 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 informasi selengkapnya, lihat
dokumentasi package_group
.