Bazel, çalışma alanı adı verilen bir dizin ağacında düzenlenmiş kaynak koddan yazılım 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 dosya ve bir BUILD
dosyası içeren bir dizindir. BUILD
dosyası, kaynaktan hangi yazılım çıkışlarının oluşturulabileceğini belirtir.
Workspace
Çalışma alanı, dosya sisteminizde, oluşturmak 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 çıktıları oluşturmak için gereken harici bağımlılıklarla ilgili referanslar içerebilir.
WORKSPACE
adlı dosyayı içeren dizinler, çalışma alanının kökü olarak kabul edilir. Bu nedenle, Bazel, WORKSPACE
dosyası içeren bir alt dizinde köklenen çalışma alanındaki tüm dizin ağaçlarını yok sayar. Çünkü bu dizin ağaçları başka bir çalışma alanı oluşturur.
Bazel, WORKSPACE.bazel
dosyasını WORKSPACE
dosyasının takma adı olarak da destekler.
Her iki dosya da varsa WORKSPACE.bazel
kullanılır.
Kod depoları
Kod, depolarda düzenlenir. WORKSPACE
dosyasını içeren dizin, ana deponun köküdür ve @
olarak da adlandırılır. Diğer (harici) depolar, Workspace kuralları kullanılarak WORKSPACE
dosyasında tanımlanır.
Bazel ile birlikte gelen çalışma alanı kuralları, Build Encyclopedia'daki Workspace Rules (Çalışma Alanı Kuralları) bölümünde ve yerleştirilmiş Starlark deposu kuralları ile ilgili dokümanlarda açıklanmıştır.
Harici depolar da birer depo olduğundan genellikle WORKSPACE
dosyası içerir. Ancak bu ek WORKSPACE
dosyaları Bazel tarafından yok sayılır. Özellikle, geçişli olarak bağlı olan depolar otomatik olarak eklenmez.
Paketler
Depodaki birincil kod düzenleme birimi pakettir. Paket, ilgili dosyaların bir koleksiyonu ve çıkış yapıları oluşturmak için nasıl kullanılabileceklerinin bir spesifikasyonudur.
Paket, BUILD
(veya BUILD.bazel
) adlı bir dosya içeren dizin olarak tanımlanır. Paket, dizinindeki tüm dosyaların yanı sıra BUILD
dosyası içerenler hariç olmak üzere altındaki tüm alt dizinleri 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 alt paket my/app/tests
olmak üzere iki paket vardır.
my/app/data
öğesinin 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 bulunduğu bir kapsayıcıdır. Hedeflerin çoğu iki ana türden biridir: dosyalar ve kurallar.
Dosyalar ayrıca iki türe ayrılır. Kaynak dosyalar genellikle kullanıcıların çabalarıyla yazılır ve depoya kaydedilir. Bazen türetilmiş dosyalar veya çıkış dosyaları olarak da adlandırılan oluşturulmuş dosyalar, kaynak dosyalardan oluşturulur ancak kaynak kontrolüne dahil edilmez.
İkinci hedef türü bir kural ile tanımlanır. Her kural örneği, bir giriş dosyaları grubu ile bir çıkış dosyaları 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 girişin kaynak dosya mı yoksa oluşturulmuş dosya mı olduğu çoğu durumda önemli değildir. Önemli olan yalnızca bu dosyanın içeriğidir. Bu durum, karmaşık bir kaynak dosyanın bir kural tarafından oluşturulan bir dosya ile değiştirilmesini kolaylaştırır. Örneğin, yüksek yapılandırılmış bir dosyayı manuel olarak koruma yükü çok yorucu hale geldiğinde ve birisi dosyayı türetmek için bir program yazdığında bu durum oluşur. Bu dosyanın tüketicileri için herhangi bir değişiklik yapılması gerekmez. Aksine, 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 ya da kurala bağlıdır ancak sezgisel olarak basittir: Bir C++ kitaplığı kuralı A, giriş için başka bir C++ kitaplığı kuralı B'ye sahip olabilir. Bu bağımlılığın etkisi, derleme sırasında B'nin başlık dosyalarının A'ya, bağlama sırasında B'nin sembollerinin A'ya ve yürütme sırasında B'nin çalışma zamanı verilerinin A'ya sunulmasıdır.
Tüm kuralların değişmezi, bir kural tarafından oluşturulan dosyaların her zaman kuralın kendisiyle aynı pakete ait olmasıdır. Başka bir pakete dosya oluşturmak mümkün değildir. Ancak bir kuralın girişlerinin başka bir paketten gelmesi yaygın bir durumdur.
Paket grupları, belirli kuralların erişilebilirliğini sınırlamayı amaçlayan paket kümeleridir. Paket grupları, package_group
işleviyle tanımlanır.
Üç özelliği vardır: İçerdikleri paketlerin listesi, adları ve dahil ettikleri diğer paket grupları. Bunlara yalnızca kuralların visibility
özelliğinden veya package
işlevinin default_visibility
özelliğinden başvurulabilir. Dosya oluşturmaz veya kullanmazlar.
Daha fazla bilgi için package_group
dokümanlarına bakın.