Çalışma alanları, paketler ve hedefler

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.

Etiketler