Kod Deposu Kuralları

Sorun bildirin Kaynağı göster

Bu sayfada, depo kurallarının nasıl oluşturulacağı açıklanmakta ve daha fazla ayrıntı için örnekler sağlanmaktadır.

Harici depo, yalnızca WORKSPACE dosyasında kullanılabilen ve Bazel'in yükleme aşamasında hermetik olmayan işlemi etkinleştiren bir kuraldır. Her harici depo kuralı, kendi BUILD dosyaları ve yapılarıyla kendi çalışma alanını oluşturur. Bunlar, üçüncü taraf kitaplıklara (Maven paketlenmiş kitaplıklar gibi) bağlı olmanın yanı sıra Bazel'in çalıştığı ana makineye özel BUILD dosyaları oluşturmak için de kullanılabilir.

Depo kuralı oluşturma

Bir .bzl dosyasında, yeni bir depo kuralı oluşturmak ve bunu bir genel değişkende depolamak için repository_rule işlevini kullanın.

Özel depo kuralı, yerel depo kuralı gibi kullanılabilir. Zorunlu bir name özelliğine sahiptir ve derleme dosyalarında bulunan her hedef @<name>//package:target olarak ifade edilebilir. Burada <name>, name özelliğinin değeridir.

Kural, açıkça derlediğinizde veya derlemenin bağımlılığı olduğunda yüklenir. Bu durumda, Bazel implementation işlevini yürütür. Bu işlevde deponun, içeriğin ve BUILD dosyalarının nasıl oluşturulacağı açıklanmaktadır.

Özellikler

Özellik, url veya sha256 gibi bir kural bağımsız değişkenidir. Bir depo kuralı tanımlarken özellikleri ve türlerini listelemeniz gerekir.

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

Bir özelliğe erişmek için repository_ctx.attr.<attribute_name> kullanın.

Tüm repository_rule'lerin, örtülü olarak tanımlanmış özellikleri vardır (tıpkı derleme kuralları gibi). İki örtülü özellik, name (tıpkı derleme kurallarında olduğu gibi) ve repo_mapping şeklindedir. Bir depo kuralının adına repository_ctx.name ile erişilebilir. repo_mapping, yerel depo kuralları local_repository ve new_local_repository ile aynıdır.

Ö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. Kuralın gerçek mantığını içerir ve yalnızca Yükleme Aşamasında yürütülür.

İşlev, repository_ctx adlı tam bir giriş parametresine sahiptir. İşlev, kuralın belirtilen parametrelere göre tekrarlanabilir olduğunu belirtmek için None veya bu kural için bir dizi parametre içeren ve kuralı, aynı depoyu oluşturan tekrarlanabilir bir kurala dönüştürecek bir dikte döndürür. Örneğin, bir git deposunu izleyen bir kural söz konusu olduğunda, bu, başlangıçta belirtilen kayan bir dal yerine belirli bir kaydetme tanımlayıcısı döndürme anlamına gelir.

repository_ctx giriş parametresi, özellik değerlerine ve hermetik olmayan işlevlere (ikili dosya bulma, ikili program yürütme, depoda dosya oluşturma veya internetten dosya indirme) erişmek için kullanılabilir. Daha fazla bilgi için kitaplığa göz atın. Ö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?

Depo local olarak tanımlanırsa bağımlılık grafiğindeki bir bağımlılığın değiştirilmesi (WORKSPACE dosyasının kendisi dahil) uygulama işlevinin yürütülmesine neden olur.

Uygulama işlevi, istediği bir bağımlılık eksikse yeniden başlatılabilir. Uygulama işlevinin başlangıcı, bağımlılık çözüldükten sonra yeniden yürütülür. Gereksiz yeniden başlatmaları (ağ erişiminin tekrarlanması gerekebileceği için pahalıdır) önlemek için tüm etiket bağımsız değişkenlerinin mevcut bir dosyaya çözümlenebilmesi koşuluyla etiket bağımsız değişkenleri önceden getirilir. Yalnızca işlevin yürütülmesi sırasında oluşturulan bir dizeden veya etiketten yolun çözümlenmesinin yine de yeniden başlatmaya neden olabileceğini unutmayın.

Son olarak, local olmayan kod depoları için yalnızca aşağıdaki bağımlılıklarda yapılan bir değişiklik yeniden başlatmaya neden olabilir:

  • Depo kuralını tanımlamak için .bzl dosya gerekiyor.
  • WORKSPACE dosyasında depo kuralının beyanı.
  • repository_rule işlevinin environ özelliğiyle tanımlanan herhangi bir ortam değişkeninin değeri. Bu ortam değişkeninin değeri, --action_env işaretiyle komut satırından zorunlu kılınabilir (ancak bu işaret, derlemenin her işlemini geçersiz kılar).
  • Bir etiket tarafından kullanılan ve atıfta bulunulan herhangi bir dosyanın içeriği (örneğin, mypkg/label.txt değil //mypkg:label.txt).

Harici depoların yeniden getirilmesini zorlama

Bazen harici bir depo, tanımında veya bağımlılıklarında herhangi bir değişiklik yapılmadan güncelliğini yitirebilir. Örneğin, depo getiren bir kaynak, üçüncü taraf deposunun belirli bir dalını izleyebilir ve bu dalda yeni kaydetmeler kullanılabilir. Bu durumda, bazel sync kodunu çağırarak bazel'den tüm harici depoları koşulsuz olarak yeniden getirmesini isteyebilirsiniz.

Ayrıca, bazı kurallar yerel makineyi denetler ve yerel makine yükseltilmişse güncelliğini yitirebilir. Burada bazel'dan yalnızca repository_rule tanımının configure özelliğinin ayarlandığı harici depoları yeniden getirmesini isteyebilirsiniz. bazel sync --configure kullanın.

Örnekler

  • C++ otomatik olarak yapılandırılmış araç zinciri: Yerel C++ derleyicisi, ortam ve C++ derleyicinin desteklediği işaretleri arayarak Bazel için C++ yapılandırma dosyalarını otomatik olarak oluşturmak üzere bir depo kuralı kullanır.

  • Go depoları, Go kurallarını kullanmak için gereken bağımlılıkların listesini tanımlamak amacıyla çeşitli repository_rule kullanır.

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