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 Workspace. File sumber di ruang kerja diatur dalam hierarki bertingkat yang berisi paket, di mana setiap paket adalah direktori yang berisi seperangkat file sumber dan satu file BUILD. File BUILD menentukan software apa output dapat dibuat 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 eksternal dependensi yang diperlukan untuk membuat output.

Direktori yang berisi file bernama WORKSPACE dianggap sebagai root dari Workspace. Oleh karena itu, Bazel mengabaikan pohon direktori apa pun di ruang kerja yang di-root pada subdirektori yang berisi file WORKSPACE, saat membentuk ruang kerja lain.

Bazel juga mendukung file WORKSPACE.bazel sebagai alias dari file WORKSPACE. Jika kedua file ada, WORKSPACE.bazel yang 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, atau yang dihasilkan dari modul dan ekstensi dalam sistem Bzlmod. Lihat eksternal ringkasan dependensi untuk informasi selengkapnya.

Aturan ruang kerja yang dipaketkan dengan Bazel didokumentasikan dalam Workspace Aturan di bagian Build Ensiklopedia dan dokumentasi tentang sematan Aturan repositori Starlark.

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 tidak ditambahkan secara otomatis.

Paket

Unit utama organisasi kode dalam repositori adalah paket. J adalah kumpulan file terkait dan spesifikasi bagaimana mereka dapat yang 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 berisi file BUILD. Dari definisi ini, tidak ada file atau direktori yang dapat menjadi bagian dari dua paket.

Misalnya, dalam hierarki direktori berikut ada dua paket, my/app, dan sub-paket my/app/tests. Perlu diketahui 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 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 ditulis oleh upaya orang-orang, dan memeriksa repositori. File yang dihasilkan, kadang-kadang disebut file turunan atau file {i>output<i}, tidak di-check in, tetapi yang dihasilkan dari {i>file<i} sumber.

Jenis target kedua dideklarasikan dengan aturan. Setiap instance aturan menentukan hubungan antara set input dan set file output. Tujuan input ke aturan dapat berupa file sumber, tetapi juga dapat berupa output aturan.

Apakah input ke aturan adalah file sumber atau file yang dihasilkan paling kasus tidak penting; yang penting hanyalah isi dari file tersebut. Fakta ini memudahkan penggantian file sumber yang kompleks dengan file yang dihasilkan oleh aturan, seperti yang terjadi ketika beban mengelola file terstruktur menjadi terlalu melelahkan, dan seseorang menulis program untuk mendapatkannya. Tidak ada perubahan yang diperlukan bagi pemakai file tersebut. Sebaliknya, respons yang dihasilkan file dapat dengan mudah digantikan oleh file sumber yang hanya berisi perubahan lokal.

Input ke aturan juga dapat mencakup aturan lainnya. Makna yang sebenarnya dari hubungannya sering kali cukup kompleks dan bergantung pada bahasa atau aturan, tetapi secara intuitif sederhana: aturan library C++ A mungkin memiliki library C++ lainnya aturan B untuk input. Efek dari dependensi ini adalah bahwa file {i>header<i} B tersedia untuk A selama kompilasi, simbol B tersedia untuk A selama dan data runtime B tersedia untuk A selama eksekusi.

Invarian dari semua aturan adalah bahwa file yang dihasilkan oleh aturan selalu menjadi milik paket yang sama dengan aturan itu sendiri; tidak mungkin membuat file ke paket lain. Tidak jarang input aturan berasal dari input lain paket data, tetapi

Grup paket adalah kumpulan paket yang tujuannya untuk membatasi aksesibilitas aturan tertentu. Grup paket ditentukan oleh fungsi package_group. Mereka memiliki tiga properti: daftar paket yang dikandung, namanya, dan grup paket yang mereka sertakan. Satu-satunya cara yang diizinkan untuk merujuknya adalah dari visibility aturan atau dari atribut default_visibility fungsi package; tidak menghasilkan atau memakai file. Untuk selengkapnya selengkapnya, lihat package_group dokumentasi.

Label