Repositori, ruang kerja, paket, dan target

Laporkan masalah Lihat sumber Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel mem-build software dari kode sumber yang diatur dalam hierarki direktori yang disebut repositori. Kumpulan repositori yang ditentukan terdiri dari ruang kerja. File sumber di repositori 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 sumber.

Repositori

File sumber yang digunakan dalam build Bazel diatur dalam repositori (sering kali 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.

Repositori tempat perintah Bazel saat ini dijalankan disebut repositori utama. Repositori lain (eksternal) ditentukan oleh aturan repo; 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. Repositori ini mencakup repo utama dan kumpulan semua repo eksternal yang ditentukan.

Perhatikan bahwa secara historis konsep "repositori" dan "ruang kerja" telah dicampuradukkan; 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 cara file tersebut dapat digunakan untuk menghasilkan artefak output.

Paket ditentukan sebagai direktori yang berisi 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 ada file atau direktori yang dapat menjadi bagian dari dua paket yang berbeda.

Misalnya, dalam hierarki direktori berikut, ada dua paket, my/app, dan subpaket my/app/tests. Perhatikan 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 penampung target, yang ditentukan dalam file BUILD paket. 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, dan diperiksa ke repositori. File yang dihasilkan, terkadang disebut file turunan atau file output, tidak diperiksa, tetapi dibuat dari file sumber.

Jenis target kedua dideklarasikan dengan aturan. Setiap instance aturan menentukan hubungan antara kumpulan input dan kumpulan file output. Input ke aturan dapat berupa file sumber, tetapi juga dapat berupa output dari aturan lain.

Dalam sebagian besar kasus, apakah input ke aturan adalah file sumber atau file yang dihasilkan tidak penting; yang penting hanyalah konten 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 untuk konsumen file tersebut. Sebaliknya, file yang dihasilkan dapat dengan mudah diganti oleh file sumber hanya dengan perubahan lokal.

Input ke 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 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 bahwa file yang dihasilkan oleh aturan selalu termasuk dalam paket yang sama dengan aturan itu sendiri; file tidak dapat dibuat ke dalam 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. Grup ini memiliki tiga properti: daftar paket yang dimuat, namanya, dan grup paket lain yang disertakan. Satu-satunya cara yang diizinkan untuk merujuknya adalah dari atribut visibility aturan atau dari atribut default_visibility fungsi package; keduanya tidak menghasilkan atau menggunakan file. Untuk mengetahui informasi selengkapnya, lihat dokumentasi package_group.

Label