Ruang kerja, paket, dan target

Bazel membuat software dari kode sumber yang diatur di hierarki direktori yang disebut ruang kerja. File sumber di ruang kerja diatur dalam hierarki paket bertingkat, dengan setiap paket berupa direktori yang berisi kumpulan file sumber terkait dan satu file BUILD. File BUILD menentukan output software yang dapat di-build dari sumber.

Ruang kerja

Ruang kerja adalah hierarki direktori di sistem file Anda yang berisi file sumber untuk software yang ingin dibuat. 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 hierarki direktori apa pun di ruang kerja yang di-root pada subdirektori yang berisi file WORKSPACE, karena struktur tersebut membentuk ruang kerja lain.

Bazel juga mendukung file WORKSPACE.bazel sebagai alias file WORKSPACE. Jika kedua file tersebut ada, WORKSPACE.bazel akan digunakan.

Repositori

Kode dikelola di repositori. Direktori yang berisi file WORKSPACE adalah root repositori utama, yang juga disebut @. Repositori lainnya (eksternal) ditentukan dalam file WORKSPACE menggunakan aturan ruang kerja.

Aturan ruang kerja yang dipaketkan dengan Bazel didokumentasikan di bagian Aturan Ruang Kerja di Build Encyclopedia dan dokumentasi tentang repositori Starlark tersemat aturan.

Karena repositori eksternal adalah repositori itu sendiri, repositori tersebut juga sering berisi file WORKSPACE. Namun, file WORKSPACE tambahan ini diabaikan oleh Bazel. Secara khusus, repositori yang bergantung pada transitif tidak ditambahkan secara otomatis.

Paket

Unit utama organisasi kode dalam repositori adalah paket. Paket adalah kumpulan file terkait dan spesifikasi tentang bagaimana file tersebut dapat digunakan untuk menghasilkan artefak output.

Paket ditentukan sebagai direktori yang berisi file bernama BUILD (atau BUILD.bazel). Paket menyertakan semua file dalam direktorinya, ditambah semua subdirektori di bawahnya, kecuali file 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. 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 container targets, yang ditentukan dalam file BUILD paket. Sebagian besar target merupakan salah satu dari dua jenis utama, file dan aturan.

File dibagi menjadi dua jenis. File sumber biasanya ditulis oleh upaya orang, dan check in 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 mungkin juga merupakan output dari aturan lain.

Apakah input atau aturan adalah file sumber atau file yang dihasilkan dalam sebagian besar kasus 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 terstruktur secara manual menjadi terlalu melelahkan, dan seseorang menulis untuk memperolehnya. Konsumen tidak perlu melakukan perubahan apa pun. Sebaliknya, file yang dihasilkan dapat 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 rumit dan bergantung pada bahasa atau aturan, tetapi secara intuitif itu sederhana: aturan library C++ A mungkin memiliki aturan B library C++ lainnya 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 berada dalam paket yang sama dengan aturan itu sendiri; Anda tidak dapat menghasilkan file ke dalam paket lain. Namun, wajar saja jika input aturan berasal dari paket lain.

Grup paket adalah kumpulan paket yang tujuannya adalah untuk membatasi aksesibilitas aturan tertentu. Grup paket ditentukan oleh fungsi package_group. Memiliki tiga properti: daftar paket yang ada di dalamnya, nama, dan grup paket lainnya yang disertakan di dalamnya. Satu-satunya cara yang diperbolehkan untuk mereferensikannya adalah dari atribut visibility aturan atau atribut default_visibility dari fungsi package; mereka tidak menghasilkan atau memakai file. Untuk informasi selengkapnya, lihat dokumentasi package_group.

Label