Bu sayfada, makroları ve kuralları kullanarak BUILD dilinin nasıl genişletileceği açıklanmaktadır.
Bazel uzantıları, .bzl
ile biten dosyalardır. Bir uzantıdan sembol içe aktarmak için yükleme ifadesi kullanın.
Daha ileri düzey kavramları öğrenmeden önce:
Hem
BUILD
hem de.bzl
dosyalarında kullanılan Starlark dili hakkında bilgi edinin.İki
BUILD
dosyası arasında değişkenleri nasıl paylaşacağınızı öğrenin.
Makrolar ve kurallar
Makro, kuralları oluşturan bir işlevdir. Makrolar iki türde sunulur: sembolik makrolar (Bazel 8'de yeni) ve eski makrolar. İki makro türü farklı şekilde tanımlanır ancak kullanıcı açısından neredeyse aynı şekilde çalışır. Bir BUILD
dosyası çok tekrarlı veya çok karmaşık hale geldiğinde makro kullanışlıdır. Makro, bazı kodları yeniden kullanmanıza olanak tanır. İşlev, BUILD
dosyası okunur okunmaz değerlendirilir. BUILD
dosyası değerlendirildikten sonra Bazel'in makrolar hakkında çok az bilgisi olur. Makronuz genrule
oluşturuyorsa Bazel, genrule
öğesini BUILD
dosyasında bildirmişsiniz gibi neredeyse davranır. (Tek istisna, sembolik bir makroda bildirilen hedeflerin özel görünürlük semantiğine sahip olmasıdır: Sembolik bir makro, dahili hedeflerini paketin geri kalanından gizleyebilir.)
Kural, makrodan daha güçlüdür. Bazel'in iç işleyişine erişebilir ve neler olup bittiği üzerinde tam kontrole sahip olabilir. Örneğin, bilgileri diğer kurallara iletebilir.
Basit mantığı yeniden kullanmak istiyorsanız makroyla başlayın. Daha eski Bazel sürümlerini desteklemeniz gerekmiyorsa sembolik bir makro kullanmanızı öneririz. Bir makro karmaşık hale gelirse genellikle onu kurala dönüştürmek iyi bir fikirdir. Yeni bir dil için destek genellikle bir kural aracılığıyla sağlanır. Kurallar, ileri düzey kullanıcılar içindir ve çoğu kullanıcının hiçbir zaman kural yazması gerekmez. Bu kullanıcılar yalnızca mevcut kuralları yükleyip çağırır.
Değerlendirme modeli
Derleme üç aşamadan oluşur.
Yükleme aşaması. Öncelikle, tüm uzantıları ve derleme için gereken tüm
BUILD
dosyaları yükleyip değerlendirin.BUILD
dosyalarının yürütülmesi yalnızca kuralları başlatır (bir kural her çağrıldığında bir grafiğe eklenir). Makrolar burada değerlendirilir.Analiz aşaması. Kuralların kodu yürütülür (
implementation
işlevleri) ve işlemler oluşturulur. Bir işlem, bir dizi girişten nasıl bir dizi çıkış oluşturulacağını açıklar. Örneğin, "hello.c üzerinde gcc'yi çalıştır ve hello.o'yu al". Gerçek komutları yürütmeden önce hangi dosyaların oluşturulacağını açıkça belirtmeniz gerekir. Başka bir deyişle, analiz aşaması, yükleme aşamasında oluşturulan grafiği alır ve bir işlem grafiği oluşturur.Yürütme aşaması. İşlemler, çıkışlarından en az biri gerektiğinde yürütülür. Bir dosya eksikse veya bir komut bir çıkış oluşturamazsa derleme başarısız olur. Bu aşamada testler de yapılır.
Bazel, .bzl
ve BUILD
dosyalarını okumak, ayrıştırmak ve değerlendirmek için paralellik kullanır. Bir dosya, derleme başına en fazla bir kez okunur ve değerlendirmenin sonucu önbelleğe alınarak yeniden kullanılır. Bir dosya yalnızca tüm bağımlılıkları (load()
ifadeler) çözüldükten sonra değerlendirilir. .bzl
dosyasının yüklenmesi, tasarım gereği görünür bir yan etkiye neden olmaz. Yalnızca değerleri ve işlevleri tanımlar.
Bazel akıllı olmaya çalışır: Hangi dosyaların yüklenmesi, hangi kuralların analiz edilmesi ve hangi işlemlerin yürütülmesi gerektiğini bilmek için bağımlılık analizini kullanır. Örneğin, bir kural geçerli derleme için ihtiyacınız olmayan işlemler oluşturursa bu işlemler yürütülmez.
Uzantı oluşturma
Bazı kodları yeniden kullanmak için ilk makronuzu oluşturun. Ardından makrolar hakkında daha fazla bilgi edinin ve "özel fiiller" oluşturmak için bunları kullanma hakkında bilgi edinin.
Kuralları kullanmaya başlamak için kurallar eğitimini inceleyin. Ardından, kurallarla ilgili kavramlar hakkında daha fazla bilgi edinebilirsiniz.
Kendi uzantılarınızı yazarken aşağıdaki iki bağlantıdan çok faydalanabilirsiniz. Erişebileceğiniz yerlerde saklayın:
Daha fazlasını yapma
Makrolara ve kurallara ek olarak yönler ve depo kuralları da yazabilirsiniz.
Kodunuzu biçimlendirmek ve lint'lemek için Buildifier'ı tutarlı bir şekilde kullanın.
.bzl
Stil kılavuzunu uygulayın.Kodunuzu test edin.
Kullanıcılarınıza yardımcı olmak için doküman oluşturun.
Kodunuzun performansını optimize edin.
Uzantılarınızı başkalarıyla paylaşın.