Ruang kerja, paket, dan target

Laporkan masalah Lihat sumber Per Malam · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bazel membangun perangkat lunak dari kode sumber yang terorganisir dalam pohon direktori yang disebut sebuah ruang kerja. File sumber di ruang kerja diatur dalam susunan bertingkat hierarki paket, di mana setiap paket adalah direktori yang berisi satu set dari file sumber terkait dan satu file BUILD. File BUILD menentukan {i>output<i} perangkat lunak dapat dibangun 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 membuat 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 di-root di subdirektori yang berisi file WORKSPACE, karena membentuk ruang kerja lain.

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

Repositori

Kode diatur di dalam repositori. Direktori yang berisi WORKSPACE adalah root repositori utama, juga disebut @. Lainnya, (eksternal) repositori ditentukan dalam file WORKSPACE menggunakan aturan Workspace.

Aturan ruang kerja yang dipaketkan dengan Bazel didokumentasikan dalam Aturan Workspace di Buat Ensiklopedia dan dokumentasi tentang aturan repositori Starlark yang disematkan.

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

Paket

Unit utama organisasi kode dalam repositori adalah paket. J paket adalah kumpulan file terkait dan spesifikasi bagaimana mereka dapat digunakan untuk menghasilkan artefak {i>output<i}.

Paket didefinisikan sebagai direktori yang berisi file bernama BUILD (atau BUILD.bazel). Sebuah paket mencakup semua file dalam direktorinya, ditambah semua subdirektori di bawahnya, kecuali yang memuat sendiri File BUILD. Dari definisi ini, tidak ada file atau direktori yang dapat menjadi bagian dari dua paket yang berbeda.

Misalnya, pada pohon direktori berikut, ada dua paket, my/app, dan sub-paket my/app/tests. Perlu diketahui bahwa my/app/data bukan merupakan 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

Target

Paket adalah container target, yang ditentukan dalam File BUILD. Sebagian besar target adalah salah satu dari dua jenis utama, yaitu file dan aturan.

File dibagi lagi menjadi dua jenis. File sumber biasanya yang ditulis oleh orang-orang, dan masuk ke repositori. File yang dihasilkan, terkadang disebut file turunan atau file output. tidak di-check in, namun dihasilkan dari file sumber.

Jenis target kedua dideklarasikan dengan aturan. Setiap aturan menetapkan hubungan antara set input dan set file output. Input ke aturan dapat berupa file sumber, tetapi juga mungkin merupakan {i>output<i} dari aturan lain.

Apakah input ke aturan berupa file sumber atau file yang dihasilkan dalam kebanyakan kasus tidak penting; yang penting hanyalah isi dari . Fakta ini memudahkan untuk mengganti {i>file<i} sumber yang kompleks dengan file yang dihasilkan oleh suatu aturan, seperti yang terjadi ketika beban mengelola file yang sangat terstruktur secara manual menjadi melelahkan, dan seseorang menulis program untuk mendapatkannya. Tidak ada perubahan yang diperlukan oleh konsumen file tersebut. Sebaliknya, respons yang dihasilkan file dapat dengan mudah diganti dengan file sumber yang hanya memiliki perubahan.

Input ke aturan juga dapat mencakup aturan lainnya. Tujuan makna yang tepat dari hubungan tersebut sering kali cukup kompleks dan bergantung pada bahasa atau aturan, tetapi secara intuitif hal ini sederhana: aplikasi C++ aturan library A mungkin memiliki aturan library C++ B lain untuk input. Efek dari dependensi ini adalah bahwa file {i>header<i} B tersedia untuk A selama kompilasi, simbol B tersedia untuk A selama penautan, dan data runtime B tersedia untuk A selama dalam proses eksekusi.

Invarian dari semua aturan adalah file yang dihasilkan oleh aturan selalu termasuk dalam paket yang sama dengan aturan itu sendiri; tidak mungkin untuk menghasilkan file ke dalam paket lain. Merupakan hal yang wajar. agar 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. Mereka memiliki tiga properti: daftar paket yang dikandung, namanya, dan kelompok paket lain yang mereka sertakan. Satu-satunya cara yang diperbolehkan untuk merujuknya adalah dari atribut visibility aturan atau dari default_visibility atribut fungsi package; tidak menghasilkan atau memakai file. Untuk informasi selengkapnya, lihat Dokumentasi package_group.

Label