Kod Deposu Kuralları

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada kod deposu kurallarının nasıl oluşturulacağı açıklanır ve inceleyebilirsiniz.

Harici depo, yalnızca WORKSPACE dosyasıdır ve yükleme aşamasında hermetik olmayan işlemi etkinleştirir. elde etti. Her harici depo kuralı, kendi çalışma alanını ve BUILD dosyalarına ve yapısına sahip olabilir. Üçüncü taraflara bağımlı olmak için kitaplıklarını (Maven paketlenmiş kitaplıkları gibi) yanı sıra BUILD dosyası oluşturmayı da sağlar. ana makineye özgü olduğunu unutmayın.

Depo kuralı oluşturma

.bzl dosyasında Yeni bir kod oluşturmak için repository_rule kod deposu kuralına ekleyin ve bunu bir genel değişkende depolayın.

Özel depo kuralı, yerel depo kuralı gibi kullanılabilir. Google zorunlu bir name özelliğine ve derleme dosyalarında bulunan her hedefe sahiptir @<name>//package:target olarak ifade edilebilir. Burada <name>, name özelliği için de kullanılmaktadır.

Kural, açıkça derlediğinizde yüklenir. seçeceğim. Bu durumda, Bazel implementation işlevini yürütür. Bu fonksiyonunda deponun, içeriğinin ve BUILD dosyalarının nasıl oluşturulacağını açıklanır.

Özellikler

Özellik, attrs kural bağımsız değişkenine dikt olarak iletilen kural bağımsız değişkenleridir. Özellikler ve türleri, bir repository kuralı. url ve sha256 özelliklerini dizeler:

local_repository = repository_rule(
    implementation=_impl,
    local=True,
    attrs={
        "url": attr.string(mandatory=True)
        "sha256": attr.string(mandatory=True)
    }
)

Uygulama işlevindeki bir özelliğe erişmek için repository_ctx.attr.<attribute_name>:

def _impl(repository_ctx):
    url = repository_ctx.attr.url
    checksum = repository_ctx.attr.sha256

Tüm repository_rule'lar, örtülü olarak tanımlanmış özelliklere sahiptir (tıpkı kuralları) belirlemeye olanak tanır. İki örtülü özellik şunlardır: name (tıpkı derleme kurallarında olduğu gibi) ve repo_mapping. Bir depo kuralının adına şu kişiler dahildir: repository_ctx.name repo_mapping kelimesinin anlamı yerel depo kuralları local_repository ve new_local_repository.

Özellik adı _ ile başlıyorsa özeldir ve kullanıcılar bunu ayarlayamaz.

Uygulama işlevi

Her depo kuralı için implementation işlevi gerekir. Belge, yükleme Aşamasında tam olarak yürütülür.

İşlev, repository_ctx adlı tam bir giriş parametresine sahiptir. İşlev kuralın tekrarlanabilir olduğunu belirtmek için None değerini döndürür veya bu kural için bir dizi parametre içeren bir dikte kuralı, aynı depoyu oluşturan tekrarlanabilir bir kurala dönüştürür. Örneğin, Örneğin, Git deposunu izleyen bir kural için ilk başta bu değerde olan kayan bir dal yerine belirli bir taahhüt tanımlayıcısı belirtiliyor.

repository_ctx giriş parametresi şu amaçlar için kullanılabilir: erişim özellik değerlerine ve hermetik olmayan işlevlere (ikili program, ikili program yürütme, depoda dosya oluşturma veya dosya indirme daha fazla içerik sunar. Daha fazla bilgi için kitaplığa göz atın daha yakından inceleyeceğiz. Örnek:

def _impl(repository_ctx):
  repository_ctx.symlink(repository_ctx.attr.path, "")

local_repository = repository_rule(
    implementation=_impl,
    ...)

Uygulama işlevi ne zaman yürütülür?

Deponun uygulama işlevi, Bazel için bir başka bir hedef her zaman başka bir hedef olduğunda veya komut satırında belirtip belirtmediğine bağlıdır. İlgili içeriği oluşturmak için kullanılan uygulama işlevinin dosyada depoyu oluşturması beklenir. bahsedeceğim. Buna "getirme" adı verilir seçeceğim.

Normal hedeflerin aksine depolar, kod deposunun farklı olmasına yol açacak birtakım değişiklikler yapmaktır. Bu Çünkü Bazel'in değişiklikleri algılayamadığı veya her derleme için çok fazla ek yüke neden olur (örneğin, ağdan). Bu nedenle, depolar yalnızca aşağıdaki şeyler değişir:

  • WORKSPACE dosyası yükleyin.
  • Deponun uygulanmasını içeren Starlark kodu.
  • environ ile belirtilen tüm ortam değişkenlerinin değeri repository_rule özelliğinin değeri. Bu ortam değişkenlerinin değerleri, komutta kablolara bağlı olabilir. , --action_env (ancak bu işaret, derlemenin her işlemini geçersiz kılar).
  • read(), execute() ve benzeri öğelere iletilen dosyaların içeriği bir etiketle başvuruda bulunulan repository_ctx yöntemleri (örneğin, //mypkg:label.txt ancak mypkg/label.txt değil)
  • bazel sync yürütüldüğünde.

Depoların ne zaman ne zaman çalışacağını kontrol eden iki repository_rule parametresi vardır geri getirilir:

  • configure işareti ayarlanırsa depo yalnızca şurada yeniden getirilir: --configure parametresi kendisine aktarıldığında bazel sync ( özelliği ayarlanmazsa bu komut yeniden getirme işlemine neden olmaz)
  • local işareti ayarlanırsa yukarıdaki durumlara ek olarak depo şu şekilde olur: yeniden getirilirse veya URL'leri etkileyen herhangi bir dosya, Bazel sunucusu depo değişikliklerinin bildirilmesi (ör. WORKSPACE dosyası veya dosya ya da web sayfası bir defa veya birden fazla web sitesi tarafından veya kodunun tanımlanması gerekir.

    Yerel olmayan depolar bu durumlarda yeniden getirilmez. Çünkü bu depoların ağ ile iletişim kurduğu veya başka bir Pahalı.

Uygulama işlevini yeniden başlatma

Uygulama işlevi, kod deposu işlenirken yeniden başlatılabilir istediği bir bağımlılık eksikse getirilir. Böyle bir durumda, uygulama işlevi durur, eksik bağımlılık bu işlev, bağımlılık çözüldükten sonra yeniden yürütülür. Alıcı: gereksiz yeniden başlatmalardan kaçının (ağ erişimi tekrarlanması gerekiyorsa) etiket bağımsız değişkenleri, tüm standart etiket bağımsız değişkenleri mevcut bir dosyaya çözümlenebilir. Sorun çözüldüğünde, yalnızca yürütme sırasında oluşturulan bir dizeden veya etiketten alınan yol işlevin yeniden başlatılması yeniden başlatmaya neden olabilir.

Harici depoların yeniden getirilmesini zorlama

Bazen harici bir depo, şurada herhangi bir değişiklik yapılmadan güncelliğini yitirebilir: ve bağımlılıklarını anlamanıza yardımcı olur. Örneğin depodan gelen kaynaklar bir üçüncü taraf deposunun belirli bir dalını takip edebilir ve üzerinden erişilebilir. Bu durumda, bazel'dan tüm harici depoları koşulsuz olarak bazel sync çağırarak yeniden gönderin.

Ayrıca, bazı kurallar yerel makineyi denetler ve yerel makine yeni sürüme geçirildiyse güncel değildir. Burada, Bazel'dan şunları yapmasını isteyebilirsiniz: yalnızca repository_rule tanımında configure özellik ayarlanmış, bazel sync --configure kullanın.

Örnekler

  • C++ otomatik yapılandırılmış araç zinciri: bir depo kuralı kullanır. Yerel C++ derleyicisi olan Bazel için C++ yapılandırma dosyalarını ortamı ve C++ derleyicisinin desteklediği işaretler.

  • Go depoları bağımlılık listesini tanımlamak için birkaç repository_rule kullanır gereken tüm bilgileri içerir.

  • rules_jvm_external oluşturma varsayılan olarak @maven adlı ve derleme hedefleri oluşturan harici bir depo geçişli bağımlılık ağacındaki her Maven yapısı için geçerlidir.