Çalışma alanları, paketler ve hedefler

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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, paketlerin iç içe yerleştirilmiş hiyerarşisinde düzenlenir. Her paket, bir dizi ilgili kaynak dosyayı ve bir BUILD dosyasını 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ı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 dosyasında çalışma alanı kuralları kullanılarak tanımlanır veya Bzlmod sistemindeki modüllerden ve uzantılardan oluşturulur. Daha fazla bilgi için harici bağımlılıklara genel bakış konusuna bakın.

Bazel ile birlikte gelen çalışma alanı kuralları, Workspace Rules (Çalışma Alanı Kuralları) bölümünde Build Encyclopedia (Derleme Ansiklopedisi) ve embedded Starlark repository rules (Yerleştirilmiş Starlark Deposu Kuralları) dokümanlarında 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 spesifikasyonudur.

Paket, BUILD (veya BUILD.bazel) adlı bir dosyayı 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ıma göre hiçbir dosya veya dizin iki farklı paketin parçası olamaz.

Örneğin, aşağıdaki dizin ağacında iki paket vardır: my/app ve alt paket my/app/tests. my/app/data öğesinin 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 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 insanların çabalarıyla yazılır ve depoya kaydedilir. Bazen türetilmiş dosyalar veya çıkış dosyaları olarak da adlandırılan oluşturulan dosyalar, kaynak dosyalardan oluşturulur ancak kaynak kontrolüne eklenmez.

İ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 önemsizdir. Ö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 dosyayla 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 bunu türetmek için bir program yazdığında bu durum ortaya çıkar. Bu dosyanın tüketicilerinin herhangi bir değişiklik yapması gerekmez. Bunun 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 tarafından kullanılabilmesi, bağlama sırasında B'nin sembollerinin A tarafından kullanılabilmesi ve yürütme sırasında B'nin çalışma zamanı verilerinin A tarafından kullanılabilmesidir.

Tüm kuralların değişmez özelliği, 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 belgelere bakın.

Etiketler