Repositori, ruang kerja, paket, dan target

Laporkan masalah Lihat sumber

Bazel mem-build software dari kode sumber yang diatur dalam hierarki direktori yang disebut repositori. Satu set repositori yang ditentukan terdiri dari ruang kerja. File sumber di repositori disusun dalam hierarki paket bertingkat, dengan setiap paket merupakan direktori yang berisi kumpulan file sumber terkait dan satu file BUILD. File BUILD akan menentukan output software yang dapat dibuat dari sumber.

Repositori

File sumber yang digunakan di build Bazel diatur di repositori (sering disingkat menjadi repo). 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. Repositori (eksternal) lainnya ditentukan oleh aturan repositori; lihat ringkasan dependensi eksternal untuk mengetahui informasi selengkapnya.

Workspace

Ruang kerja adalah lingkungan yang digunakan bersama oleh semua perintah Bazel yang dijalankan dari repo utama yang sama. Library ini mencakup repo utama dan kumpulan semua repositori eksternal yang ditentukan.

Perhatikan bahwa secara historis, konsep "repositori" dan "ruang kerja" telah digabungkan; 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 package. Paket adalah kumpulan file terkait dan spesifikasi cara file tersebut dapat digunakan untuk menghasilkan artefak output.

Paket didefinisikan sebagai direktori yang berisi file BUILD yang bernama BUILD atau BUILD.bazel. Sebuah 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 mungkin merupakan bagian dari dua paket yang berbeda.

Misalnya, dalam hierarki direktori berikut, ada dua paket, my/app, dan sub-paket my/app/tests. Perhatikan bahwa my/app/data bukan 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 penampung target, yang ditentukan dalam file BUILD paket. Sebagian besar target merupakan salah satu dari dua jenis utama, file dan aturan.

File dibagi lagi menjadi dua jenis. File sumber biasanya ditulis oleh upaya orang, dan dimasukkan ke repositori. File yang dihasilkan, terkadang disebut file turunan atau file output, tidak dicentang, tetapi dihasilkan dari file sumber.

Jenis target kedua dideklarasikan dengan aturan. Setiap instance aturan menetapkan hubungan antara serangkaian input dan set file output. Input ke aturan dapat berupa file sumber, tetapi juga dapat berupa output aturan lainnya.

Apakah input ke aturan adalah file sumber atau file yang dihasilkan sebagian besar bersifat tidak penting; yang terpenting hanya konten file tersebut. Fakta ini memudahkan penggantian file sumber yang kompleks dengan file yang dihasilkan yang dihasilkan oleh suatu aturan, seperti ketika beban pengelolaan file yang sangat terstruktur secara manual menjadi terlalu melelahkan, dan seseorang menulis program untuk mendapatkannya. Pelanggan file tersebut tidak perlu diubah. Sebaliknya, file yang dihasilkan dapat dengan mudah diganti dengan file sumber yang hanya memiliki perubahan lokal.

Input ke aturan juga dapat menyertakan aturan lain. Arti sebenarnya dari hubungan tersebut sering kali cukup kompleks dan bergantung pada bahasa atau aturan, tetapi secara intuitif, aturan tersebut sederhana: aturan library C++ A mungkin memiliki aturan B library C++ 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 berada dalam paket yang sama dengan aturan itu sendiri. File tidak dapat dihasilkan ke paket lain. 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. Class ini memiliki tiga properti: daftar paket yang dimuatnya, namanya, dan grup paket lain yang disertakan. Satu-satunya cara yang diizinkan untuk mereferensikannya adalah dari atribut aturan visibility atau dari atribut default_visibility fungsi package; cara ini tidak menghasilkan atau memakai file. Untuk informasi selengkapnya, lihat dokumentasi package_group.

Label