Bazel, çalışma alanı adı verilen bir dizin ağacında düzenlenmiş kaynak koddan yazılım derler. Çalışma alanındaki kaynak dosyalar, iç içe geçmiş bir paket hiyerarşisinde düzenlenir. Bu hiyerarşide her paket, ilgili kaynak dosya grubunu ve bir BUILD
dosyasını içeren bir dizindir. BUILD
dosyası, hangi yazılım çıkışlarının kaynaktan oluşturulabileceğini belirtir.
Workspace
Çalışma alanı, dosya sisteminizde bulunan ve oluşturmak istediğiniz yazılımın kaynak dosyalarını içeren bir dizin ağacıdır. Her çalışma alanının WORKSPACE
adlı bir metin dosyası vardır. Bu metin dosyası 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, çalışma alanının kökü olarak kabul edilir. Bu nedenle, Bazel başka bir çalışma alanı oluşturdukları için, çalışma alanındaki dizin ağaçlarını WORKSPACE
dosyası içeren bir alt dizine sahip olan tüm dizin ağaçlarını yok sayar.
Bazel, WORKSPACE
dosyasının takma adı olarak WORKSPACE.bazel
dosyasını da destekler.
Her iki dosya da mevcutsa WORKSPACE.bazel
kullanılır.
Depolar
Kod, depolar halinde 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ı, Ancyclopedia derleme bölümündeki Workspace Kuralları bölümünde ve yerleştirilmiş Starlark deposu kuralları ile ilgili dokümanlarda açıklanmıştır.
Harici depolar kendileri kod deposu olduklarından genellikle bir WORKSPACE
dosyası da içerirler. Ancak, bu ek WORKSPACE
dosyaları Bazel tarafından yoksayılır. Özellikle, geçişli olarak bağımlı olan depolar otomatik olarak eklenmez.
Paketler
Depodaki kod düzenlemenin birincil birimi pakettir. Paket, ilgili dosyaların bir koleksiyonu ve çıktı yapıları üretmek için bu dosyaların nasıl kullanılabileceğinin bir belirtimidir.
Paket, BUILD
(veya BUILD.bazel
) adlı bir dosyayı içeren bir dizin olarak tanımlanır. Paket, dizinindeki tüm dosyalarla birlikte altındaki tüm alt dizinleri (kendisi 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
öğesinin bir paket olmadığını, 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 iki ana türden biridir: dosyalar ve kurallar.
Dosyalar ayrıca iki türe ayrılır. Kaynak dosyalar genellikle kullanıcıların çabasıyla yazılır ve depoya gönderilir. Bazen türetilmiş dosyalar veya çıkış dosyaları olarak da adlandırılan oluşturulan dosyalar işaretlenmez ancak kaynak dosyalardan oluşturulur.
İkinci hedef türü bir kural ile tanımlanır. Her kural örneği, bir giriş grubu ile çıkış dosyası grubu arasındaki ilişkiyi belirtir. Bir kurala yönelik girişler kaynak dosyalar olabilir ancak başka kuralların çıktıları da olabilir.
Bir kural girişinin kaynak dosya mı yoksa oluşturulan dosya mı olduğu çoğu durumda önemsizdir. Önemli olan yalnızca söz konusu dosyanın içeriğidir. Bu gerçek, karmaşık bir kaynak dosyanın bir kural tarafından oluşturulmuş bir dosyayla değiştirilmesini kolaylaştırır. Örneğin, yüksek düzeyde yapılandırılmış bir dosyayı manuel olarak tutma yükü fazla yorucu hale geldiğinde ve biri bu dosyayı elde etmek için bir program yazdığında ortaya çıkar. Söz konusu dosyanın kullanıcıları için herhangi bir değişiklik gerekmez. Buna karşılık, oluşturulan bir dosya yalnızca yerel değişikliklerle kolayca değiştirilebilir.
Bir kurala yönelik girişler başka 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, bir giriş için başka bir C++ kitaplık kuralı B'ye sahip olabilir. Bu bağımlılığın etkisi, B'nin başlık dosyalarının derleme sırasında A tarafından, B'nin simgelerinin bağlantı oluşturma sırasında A tarafından, B'nin çalışma zamanı verilerinin ise yürütme sırasında A tarafından kullanılabilir olmasıdır.
Tüm kurallarda değişmeyen bir durum, bir kural tarafından oluşturulan dosyaların her zaman kuralın kendisiyle aynı pakete ait olmasıdır. Dosyaları başka bir pakette oluşturmak mümkün değildir. Kural girişlerinin başka bir paketten gelmesi normaldir.
Paket grupları, belirli kuralların erişilebilirliğini sınırlandırmayı amaçlayan paket gruplarıdır. Paket grupları package_group
işleviyle tanımlanır.
Bunların üç özelliği vardır: içerdikleri paketlerin listesi, adları ve dahil ettikleri diğer paket grupları. Bunlara referans verebilmek için yalnızca kuralların visibility
özelliğinden veya package
işlevinin default_visibility
özelliğinden yararlanabilirsiniz; dosya oluşturmaz veya kullanmazlar.
Daha fazla bilgi için package_group
dokümanlarına bakın.