Bazel, yazılımları bir Workspace adlı dizin ağacında düzenlenen kaynak koddan oluşturur. Çalışma alanındaki kaynak dosyalar, iç içe yerleştirilmiş bir paket hiyerarşisinde düzenlenir. Her paket, bir dizi ilgili kaynak dosyayı ve bir BUILD
dosyasını içeren bir dizindir. BUILD
dosyası, kaynaktan hangi yazılım çıkışlarının oluşturulabileceğini belirtir.
Çalışma alanı
Çalışma alanı, derlemek istediğiniz yazılımın kaynak dosyalarını içeren dosya sisteminizde 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 dosya içeren dizinler, bir ç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ı
Kodlar depolarda 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 Workspace kuralları kullanılarak tanımlanır.
Bazel ile birlikte sunulan çalışma alanı kuralları, Derleme Ansiklopedisi'ndeki Çalışma Alanı Kuralları bölümünde ve yerleşik Starlark depo kuralları ile ilgili belgelerde açıklanmıştır.
Harici depolar da depo olduğundan genellikle bir WORKSPACE
dosyası da içerir. Ancak bu ek WORKSPACE
dosyaları Bazel tarafından yoksayılır. Özellikle, geçişli olarak bağlı olan depolar otomatik olarak eklenmez.
Paketler
Bir depodaki birincil kod düzenleme birimi pakettir. Paket, ilgili dosyaların bir koleksiyonu 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, kendi içinde BUILD
dosyası içerenler hariç olmak üzere, dizinindeki tüm dosyaları ve altındaki tüm alt dizinleri içerir. Bu tanım uyarınca, 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 kullanıcılar tarafından yazılır ve depoya kaydedilir. 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 tanımlanır. Her kural örneği, bir giriş dosyası grubu ile çıkış dosyası grubu arasındaki ilişkiyi belirtir. Bir kuralın girişleri kaynak dosyalar olabilir ancak diğer kuralların çıkışları da olabilir.
Bir kurala girilen girişin kaynak dosya mı yoksa oluşturulmuş dosya mı olduğu çoğu durumda önemli değildir. Önemli olan yalnızca söz konusu dosyanın içeriğidir. Bu durum, karmaşık bir kaynak dosyayı bir kural tarafından oluşturulan bir dosyayla değiştirmeyi kolaylaştırır. Örneğin, yüksek oranda yapılandırılmış bir dosyayı manuel olarak yönetme yükü çok yorucu hale geldiğinde ve bir kullanıcı bu dosyayı türetecek bir program yazdığında bu durum ortaya çıkar. Bu dosyayı kullananların herhangi bir değişiklik yapması 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: Bir C++ kitaplık kuralı A, giriş için başka bir C++ kitaplık kuralı B'ye sahip olabilir. Bu bağımlılık, derleme sırasında A'nın B'nin başlık dosyalarını, bağlama sırasında B'nin simgelerini ve yürütme sırasında B'nin çalışma zamanı verilerini kullanabilmesini sağlar.
Tüm kuralların değişmez bir özelliği, bir kural tarafından oluşturulan dosyaların her zaman kuralın kendisiyle aynı pakete ait olmasıdır. Başka bir pakette dosya oluşturmak mümkün değildir. Bununla birlikte, bir kuralın girişlerinin başka bir paketten gelmesi normaldir.
Paket grupları, amacı belirli kuralların erişilebilirliğini sınırlamak olan paket kümeleridir. Paket grupları package_group
işlevi tarafından 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.