Bazel, çalışma alanı adı verilen bir dizin ağacında düzenlenmiş kaynak kodundan yazılım derler. Çalışma alanındaki kaynak dosyalar, iç içe yerleştirilmiş bir paket hiyerarşisinde düzenlenir. Her paket, ilgili kaynak dosyaları ve bir BUILD
dosyası içeren dizindir. BUILD
dosyası, kaynaktan hangi yazılım çıkışlarının oluşturulabileceğini belirtir.
Çalışma alanı
Çalışma alanı, dosya sisteminizde bulunan ve derlemek istediğiniz yazılımın kaynak dosyalarını içeren bir dizin ağacıdır. Her çalışma alanında, WORKSPACE
adlı bir metin dosyası bulunur. Bu dosya boş olabilir veya çıkışları oluşturmak için gereken harici bağımlılıklara referanslar içerebilir.
WORKSPACE
adlı bir dosyayı içeren dizinler, çalışma alanının kökü olarak kabul edilir. Bu nedenle Bazel, başka bir çalışma alanı oluşturdukları için WORKSPACE
dosyası içeren bir alt dizinde köklenen bir çalışma alanındaki tüm dizin ağaçlarını yoksayar.
Bazel, WORKSPACE
dosyasının takma adı olarak WORKSPACE.bazel
dosyasını da destekler. Her iki dosya da mevcutsa WORKSPACE.bazel
kullanılır.
Kod depoları
Kod, repositories düzenlenir. WORKSPACE
dosyasını içeren dizin, @
olarak da adlandırılan ana deponun köküdür. Diğer (harici) depoları, WORKSPACE
dosyasında çalışma alanı kuralları kullanılarak tanımlanır veya Bzlmod sistemindeki modül ve uzantılardan oluşturulur. Daha fazla bilgi için harici bağımlılıklara genel bakış konusuna bakın.
Bazel ile paket halinde sunulan çalışma alanı kuralları, Derleme Ensiklopedisi'ndeki Çalışma Alanı Kuralları bölümünde ve yerleştirilmiş Starlark deposu kuralları ile ilgili dokümanlarda belgelenmiştir.
Harici depolar doğrudan depo olduğu için genellikle bir WORKSPACE
dosyası da içerirler. Ancak bu ek WORKSPACE
dosyaları Bazel tarafından yok sayılır. Özellikle de geçişli şekilde bağımlı olan depolar otomatik olarak eklenmez.
Paketler
Bir depodaki kod organizasyonunun birincil birimi pakettir. Paket, ilgili dosyaların bir koleksiyonudur ve çıkış yapılarını oluşturmak için nasıl kullanılabileceklerine dair bir spesifikasyondur.
Paket, BUILD
(veya BUILD.bazel
) adlı bir dosya içeren bir dizin olarak tanımlanır. Paket, dizinindeki tüm dosyaları ve altındaki tüm alt dizinleri (BUILD
dosyası içerenler hariç) içerir.
Bu tanıma göre hiçbir dosya veya dizin, iki farklı paketin parçası olamaz.
Örneğin, aşağıdaki dizin ağacında my/app
ve my/app/tests
alt paketi olmak üzere iki paket vardır. my/app/data
'ün bir paket değil, my/app
paketine ait bir dizin olduğunu unutmayın.
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
Hedefler
Paket, paketin BUILD
dosyasında tanımlanan hedeflerin kapsayıcısıdır. Çoğu hedef, dosyalar ve kurallar olmak üzere iki ana türden biridir.
Dosyalar ayrıca iki türe ayrılır. Kaynak dosyalar genellikle insanların çalışmaları tarafından yazılır ve depoya giriş yapar. Bazen türetilmiş dosyalar veya çıkış dosyaları olarak da adlandırılan oluşturulan dosyalar, kontrol edilmez ancak kaynak dosyalardan oluşturulur.
İkinci hedef türü, bir kural ile belirtilir. Her kural örneği, bir giriş dosyası grubu ile bir çıkış dosyası grubu arasındaki ilişkiyi belirtir. Bir kuralın girişleri kaynak dosyalar olabileceği gibi diğer kuralların çıkışları da olabilir.
Bir kurala ait girişin kaynak dosya mı yoksa oluşturulan bir dosya mı olduğu çoğu durumda önemsizdir. Önemli olan o dosyanın içeriğidir. Bu durum, karmaşık bir kaynak dosyanın, bir kural tarafından üretilen oluşturulmuş bir dosyayla değiştirilmesini kolaylaştırır. Örneğin, yüksek yapılandırılmış bir dosyayı manuel olarak yönetme yükü çok yorucu hale gelir ve biri bu dosyayı türetmek için bir program yazar. Bu dosyayı kullananlar için herhangi bir değişiklik gerekmez. Buna karşılık, oluşturulan bir dosya, yalnızca yerel değişiklikler içeren bir kaynak dosyayla kolayca değiştirilebilir.
Bir kuralın girişleri diğer kuralları da içerebilir. Bu tür ilişkilerin tam anlamı genellikle oldukça karmaşıktır ve dile veya kurala bağlıdır ancak sezgisel olarak basittir: A C++ kitaplığı kuralı, giriş için başka bir C++ kitaplığı kuralı B'ye sahip olabilir. Bu bağımlılık, derleme sırasında A'nın B'nin başlık dosyalarına, bağlantı oluşturma sırasında B'nin sembollerine ve yürütme sırasında B'nin çalışma zamanı verilerine erişebilmesini sağlar.
Tüm kuralların değişmeyen bir yönü, bir kural tarafından oluşturulan dosyaların her zaman kuralın kendisiyle aynı pakete ait olmasıdır. Bu nedenle, başka bir pakette dosya oluşturulamaz. Bununla birlikte, bir kuralın girişlerinin başka bir paketten gelmesi yaygın bir durumdur.
Paket grupları, belirli kuralların erişilebilirliğini sınırlandırmak amacıyla oluşturulan paket kümeleridir. Paket grupları, package_group
işleviyle tanımlanır. Bu grupların üç özelliği vardır: İçerdikleri paketlerin listesi, adları ve içerdikleri diğer paket grupları. Bu işlevlere referans vermenin tek yolu, kuralların visibility
özelliği veya package
işlevinin default_visibility
özelliğidir. Bu işlevler dosya oluşturmaz veya tüketmez. Daha fazla bilgi için package_group
dokümanlarına bakın.