Bazel membangun perangkat lunak dari kode sumber yang terorganisir dalam pohon direktori yang disebut
Workspace. 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 software apa
output dapat dibuat dari sumber.
Workspace
Ruang kerja adalah hierarki direktori di sistem file yang berisi sumber
file untuk perangkat lunak 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 mem-build output.
Direktori yang berisi file bernama WORKSPACE
dianggap sebagai root dari
Workspace. Oleh karena itu, Bazel mengabaikan hierarki direktori apa pun di ruang kerja yang berakar di
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 diorganisir di repositories. Direktori yang berisi file WORKSPACE
adalah root repositori utama, yang juga disebut @
. Repositori (eksternal)
lainnya ditentukan dalam file WORKSPACE
menggunakan aturan ruang kerja, atau
dibuat dari modul dan ekstensi di sistem Bzlmod. Lihat eksternal
ringkasan dependensi untuk informasi selengkapnya.
Aturan ruang kerja yang dipaketkan dengan Bazel didokumentasikan dalam Workspace Aturan di bagian Build Ensiklopedia dan dokumentasi tentang sematan Aturan repositori Starlark.
Karena repositori eksternal adalah repositori itu sendiri, repositori tersebut juga sering kali berisi
file WORKSPACE
. Namun, file WORKSPACE
tambahan ini
diabaikan oleh Bazel. Secara khusus, repositori yang
bergantung pada secara transitif tidak
ditambahkan secara otomatis.
Paket
Unit utama organisasi kode dalam repositori adalah paket. J paket adalah kumpulan file terkait dan spesifikasi bagaimana mereka dapat yang digunakan untuk menghasilkan artefak {i>output<i}.
Paket didefinisikan sebagai direktori yang berisi sebuah
File BUILD
bernama BUILD
atau BUILD.bazel
. Paket
menyertakan semua file dalam direktorinya, ditambah semua subdirektori di bawahnya,
kecuali yang berisi file BUILD
. Dari definisi ini, tidak
file atau direktori mungkin merupakan bagian
dari dua paket yang berbeda.
Misalnya, dalam hierarki direktori berikut ada dua paket, my/app
,
dan sub-paket my/app/tests
. Perlu diketahui bahwa my/app/data
bukan paket, tetapi
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
Target
Paket adalah container target, yang ditentukan dalam
File BUILD
. Sebagian besar target adalah salah satu dari dua jenis utama, file dan aturan.
File dibagi lagi menjadi dua jenis. File sumber biasanya ditulis oleh upaya orang-orang, dan masuk ke repositori. File yang dihasilkan, kadang-kadang disebut file turunan atau file {i>output<i}, tidak diperiksa, tetapi yang dihasilkan dari {i>file<i} sumber.
Jenis target kedua dideklarasikan dengan aturan. Setiap instance aturan menentukan hubungan antara set input dan set file output. Tujuan input ke aturan dapat berupa file sumber, tetapi juga dapat berupa output aturan.
Apakah input ke aturan adalah file sumber atau file yang dihasilkan paling kasus tidak penting; yang penting hanyalah isi dari file tersebut. Fakta ini memudahkan penggantian file sumber yang kompleks dengan file yang dihasilkan oleh aturan, seperti yang terjadi ketika beban mengelola file terstruktur menjadi terlalu melelahkan, dan seseorang menulis program untuk mendapatkannya. Tidak ada perubahan yang diperlukan bagi pemakai file tersebut. Sebaliknya, respons yang dihasilkan file dapat dengan mudah digantikan oleh file sumber yang hanya berisi perubahan lokal.
Input ke aturan juga dapat mencakup aturan lain. Makna yang sebenarnya dari hubungannya sering kali cukup kompleks dan bergantung pada bahasa atau aturan, tetapi secara intuitif sederhana: aturan library C++ A mungkin memiliki library C++ lainnya aturan B untuk input. Efek dari dependensi ini adalah bahwa file {i>header<i} B tersedia untuk A selama kompilasi, simbol B tersedia untuk A selama dan data runtime B tersedia untuk A selama eksekusi.
Invarian dari semua aturan adalah bahwa file yang dihasilkan oleh aturan selalu menjadi milik paket yang sama dengan aturan itu sendiri; tidak mungkin membuat file ke paket lain. Namun, input aturan yang berasal dari paket lain bukanlah hal yang aneh.
Grup paket adalah kumpulan paket yang tujuannya adalah untuk membatasi aksesibilitas
aturan tertentu. Grup paket ditentukan oleh fungsi package_group
. Mereka
memiliki tiga properti: daftar paket yang dikandung, namanya, dan
grup paket yang mereka sertakan. Satu-satunya cara yang diizinkan untuk merujuknya adalah dari
atribut visibility
aturan atau dari atribut default_visibility
fungsi package
; atribut tersebut tidak membuat atau menggunakan file. Untuk selengkapnya
selengkapnya, lihat package_group
dokumentasi.