Bazel, yazılımları depo adı verilen dizin ağaçlarında düzenlenen kaynak koddan oluşturur. Çalışma alanı, tanımlanmış bir kod deposu grubundan oluşur. Depolardaki kaynak dosyalar, iç içe yerleştirilmiş bir paket hiyerarşisinde düzenlenir. Her paket, bir dizi ilgili kaynak dosyası ve bir BUILD
dosyası içeren bir dizindir. BUILD
dosyası, hangi yazılım çıkışlarının kaynaktan oluşturulabileceğini belirtir.
Kod depoları
Bazel derlemesinde kullanılan kaynak dosyalar depolarda düzenlenir (genellikle depolar olarak kısaltılır). Depo, kökünde sınır işaretçisi dosyası bulunan bir dizin ağacıdır. Bu tür bir sınır işaretçisi dosyası MODULE.bazel
, REPO.bazel
veya eski bağlamlarda WORKSPACE
ya da WORKSPACE.bazel
olabilir.
Mevcut Bazel komutunun çalıştırıldığı depoya ana depo denir. Diğer (harici) depolar repo kuralları ile tanımlanır. Daha fazla bilgi için harici bağımlılıklara genel bakış başlıklı makaleyi inceleyin.
Çalışma alanı
Çalışma alanı, aynı ana depoda çalıştırılan tüm Bazel komutlarının paylaştığı ortamdır. Ana deposu ve tanımlanan tüm harici depoların kümesini kapsar.
Geçmişte "depo" ve "çalışma alanı" kavramlarının birbirine karıştırıldığını unutmayın. "Çalışma alanı" terimi genellikle ana depoyu belirtmek için kullanılmış, hatta bazen "depo"nun eş anlamlısı olarak kullanılmıştır.
Paketler
Bir depodaki kod organizasyonunun birincil birimi paket'tir. 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 BUILD
dosyası 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ımdan hareketle 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 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 girilen 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 dosyayı bir kural tarafından üretilen oluşturulmuş 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 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 kurala yapılan 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: 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ı. Bunlara referansta bulunmak için izin verilen tek yol, kuralların visibility
özelliği veya package
işlevinin default_visibility
özelliğidir; dosya oluşturmaz veya kullanmaz. Daha fazla bilgi için package_group
dokümanlarına bakın.