Ruang kerja, paket, dan target

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

Bazel mem-build software dari kode sumber yang disusun dalam sebuah hierarki direktori yang disebut ruang kerja. File sumber di ruang kerja diatur dalam hierarki paket yang bertingkat, dengan setiap paket merupakan 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 pohon direktori pada sistem file yang berisi file sumber untuk software yang ingin Anda buat. 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 di subdirektori yang berisi file WORKSPACE, karena hierarki tersebut membentuk ruang kerja lain.

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

Repositories

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

Aturan ruang kerja yang dipaketkan dengan Bazel didokumentasikan dalam bagian Workspace Rules dalam Build Encyclopedia dan dokumentasi mengenai aturan repositori Starlark tersemat.

Karena repositori eksternal adalah repositori itu sendiri, repositori sering kali juga 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. Paket adalah kumpulan file terkait dan spesifikasi cara penggunaannya untuk menghasilkan artefak output.

Paket didefinisikan 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, file atau direktori tidak dapat menjadi 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 container target, yang ditentukan dalam file BUILD paket. Sebagian besar target adalah salah satu dari dua jenis utama, yaitu file dan aturan.

File dibagi lagi 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 dihasilkan 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.

Baik input untuk aturan adalah file sumber, atau file yang dihasilkan, dalam sebagian besar kasus adalah materi yang tidak penting; yang penting hanyalah konten file tersebut. Fakta ini memudahkan untuk mengganti file sumber yang kompleks dengan file yang dihasilkan yang dihasilkan oleh aturan, seperti yang terjadi ketika beban mempertahankan file yang sangat terstruktur secara manual menjadi terlalu lelah, dan seseorang menulis program untuk mendapatkannya. Tidak ada perubahan yang diperlukan bagi konsumen file tersebut. Sebaliknya, file yang dihasilkan dapat dengan mudah diganti dengan file sumber hanya dengan perubahan lokal.

Input ke aturan juga dapat menyertakan aturan lain. Arti tepat dari hubungan semacam itu sering kali cukup kompleks dan bergantung pada bahasa atau aturan, tetapi secara intuitif sederhana: aturan library C++ A mungkin memiliki aturan library C++ B yang 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 dimiliki paket yang sama dengan aturan itu sendiri; Anda tidak dapat membuat file ke dalam paket lain. Namun, hal ini jarang terjadi jika 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. Properti ini memiliki tiga properti: daftar paket yang dimuatnya, namanya, dan grup paket lain yang disertakannya. Satu-satunya cara untuk merujuknya adalah dari atribut visibility aturan atau dari atribut default_visibility fungsi package; aturan tersebut tidak menghasilkan atau menggunakan file. Untuk informasi selengkapnya, lihat dokumentasi package_group.

Label