Bazel, çalışma alanı adı verilen bir dizin ağacında düzenlenmiş kaynak koddan yazılım oluşturuyor. Çalışma alanındaki kaynak dosyalar, iç içe yerleştirilmiş bir paket hiyerarşisinde düzenlenir. Bu hiyerarşide her paket bir ilgili kaynak dosyaları kümesi ile bir BUILD
dosyası 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ı, 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ındaWORKSPACE
Bu, boş olabilir veya
harici bağımlılıklar gerekir.
WORKSPACE
adlı bir dosya içeren dizinler, çalışma alanı kökü olarak değerlendirilir. Bu nedenle Bazel, başka bir çalışma alanı oluştururken WORKSPACE
dosyası içeren bir alt dizinde rootlanmış bir çalışma alanındaki dizin ağaçlarını yok sayar.
Bazel, WORKSPACE.bazel
dosyasını WORKSPACE
dosyasının takma adı olarak da destekliyor.
Her iki dosya da varsa WORKSPACE.bazel
kullanılır.
Depolar
Kod, depolar içinde 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.
Bazel ile birlikte sunulan çalışma alanı kuralları, Build Encyclopedia (Encyclopedia) derlemesinin Çalışma Alanı Kuralları bölümünde ve yerleştirilmiş Starlark deposuyla ilgili belgelerde belgelenmiştir kurallar.
Harici depolar depo olduklarında genellikle bir WORKSPACE
dosyası da içerir. Ancak bu ek WORKSPACE
dosyaları Bazel tarafından yok sayılır. Özellikle, geçişli olarak kullanılan depolar otomatik olarak eklenmez.
Paketler
Depodaki kod düzenlemesinin birincil birimi pakettir. Paket, ilgili dosyaların koleksiyonudur ve çıkış yapıları oluşturmak için bunların nasıl kullanılacağını belirtir.
Paket, BUILD
(veya BUILD.bazel
) adlı bir dosya içeren bir dizin olarak tanımlanır. Bir paket, dizinindeki tüm dosyaları ve birlikte BUILD
dosyası içerenler dışındaki tüm alt dizinleri içerir. Bu tanımdan sonra, hiçbir dosya veya dizin iki farklı paketin bir parçası olamaz.
Örneğin, aşağıdaki dizin ağacında iki paket vardır: my/app
ve my/app/tests
alt paketi.
my/app/data
bir paket değil, my/app
paketine ait bir dizindir.
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 hedefler kapsayıcısıdır. Çoğu hedef, iki ana dosya türünden biridir: dosyalar ve kurallar.
Dosyalar da iki türe ayrılır. Kaynak dosyalar genellikle insanların çabaları tarafından yazılır ve depoya kaydedilir. Türetilmiş dosyalar veya çıkış dosyaları olarak da adlandırılan oluşturulan dosyalar check-in yapmaz, ancak kaynak dosyalardan oluşturulur.
İkinci hedef türü, kural ile belirtilir. Her kural örneği, bir giriş kümesi ile çıkış dosyası kümesi arasındaki ilişkiyi belirtir. Bir kurala yapılan girişler kaynak dosyalar olabilir, ancak diğer kuralların çıktıları da olabilirler.
Kural girdisinin kaynak dosya mı yoksa oluşturulmuş 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şturulan dosyayla değiştirilmesini kolaylaştırır. Örneğin, yüksek düzeyde yapılandırılmış bir dosyayı manuel olarak yönetmenin yükü çok yorucu olduğunda ve bir kullanıcı, elde ederiz. Söz konusu dosyanın tüketicileri için değişiklik yapılması gerekmez. Buna karşılık, oluşturulan bir dosya, yalnızca yerel değişikliklerle bir kaynak dosyayla kolayca değiştirilebilir.
Kural girişleri diğer kuralları da içerebilir. Bu tür ilişkilerin kesin anlamı genellikle çok karmaşık ve dille veya kurala bağlı olsa da sezgisel olarak basittir: C++ kitaplık kuralı A'nın giriş için başka bir C++ kitaplık kuralı B olabilir. Bu bağımlılığın etkisi, derleme sırasında B'nin başlık dosyalarının A'ya sunulması, bağlantı sırasında B'nin simgelerinin A'ya, B'nin çalışma zamanı verilerinin ise yürütme sırasında A'ya sunulmasıdır.
Tüm kurallardan bir eşiti, 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şturulması mümkün değildir. Bununla birlikte, bir kural girişlerinin başka bir paketten gelmesi alışılmadık bir durum değildir.
Paket grupları, amacı belirli kuralların erişilebilirliğini sınırlamak olan paketlerdir. Paket grupları, package_group
işleviyle tanımlanır.
Üç özelliği vardır: içerdikleri paketlerin listesi, adları ve içerdikleri diğer paket grupları. Bunları referans almanın tek yolu, kuralların visibility
özelliğinden veya package
işlevinin default_visibility
özelliğinden gelir; dosya oluşturmaz veya kullanmaz.
Daha fazla bilgi için package_group
belgelerine bakın.