Kod Deposu Kuralları

Sorun bildirme Kaynağı görüntüleme Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bu sayfada, depo kurallarının nasıl oluşturulacağı ele alınmakta ve daha fazla bilgi için örnekler verilmektedir.

Harici depolama alanı, yalnızca WORKSPACE dosyasında kullanılabilen ve Bazel'in yükleme aşamasında hermetik olmayan çalışmayı sağlayan bir kuraldır. Her harici depolama alanı 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ğımlı olmak için kullanılabilir ancak Bazel'in çalıştığı ana makineye özel BUILD dosyaları oluşturmak için de kullanılabilir.

Depo kuralı oluşturma

Yeni bir depolama alanı kuralı oluşturmak ve bunu bir genel değişkende depolamak için .bzl dosyasında repository_rule işlevini kullanın.

Özel depolama alanı kuralları, yerel depolama alanı kuralları gibi kullanılabilir. Zorunlu bir name özelliğine sahiptir ve derleme dosyalarında bulunan her hedefe @<name>//package:target olarak atıfta bulunulabilir. Burada <name>, name özelliğinin değeridir.

Kural, açıkça derlediğinizde veya derlemenin bir bağımlılığı olduğunda yüklenir. Bu durumda Bazel, implementation işlevini yürütür. Bu işlev, deposu, içeriğini ve BUILD dosyalarını nasıl oluşturacağınızı açıklar.

Ö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> simgesini kullanın.

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

_ ile başlayan özellik adları gizlidir ve kullanıcılar bu özellikleri ayarlayamaz.

Uygulama işlevi

Her depo kuralı için bir 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.

İşlevin tam olarak bir giriş parametresi (repository_ctx) vardır. İşlev, belirtilen parametreler verildiğinde kuralın yeniden üretilebilir olduğunu belirtmek için None değerini veya söz konusu kural için bir dizi parametre içeren ve bu kuralı aynı deposu oluşturan yeniden üretilebilir bir kurala dönüştürecek bir sözlük döndürür. Örneğin, bir git deposunu izleyen bir kural için bu, başlangıçta belirtilen değişken dal yerine belirli bir taahhüt tanımlayıcısı döndürmek anlamına gelir.

repository_ctx giriş parametresi, özellik değerlerine ve hermetik olmayan işlevlere (ikili dosya bulma, ikili dosya yürütme, depolama alanında dosya oluşturma veya İnternet'ten dosya indirme) erişmek için kullanılabilir. Daha fazla bağlam bilgisi için kitaplığa bakı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ıkta yapılan değişiklik (WORKSPACE dosyası dahil) uygulama işlevinin yürütülmesine neden olur.

İstediği bir bağımlılık eksikse uygulama işlevi yeniden başlatılabilir. Bağımlılık çözüldükten sonra uygulama işlevinin başlangıcı yeniden yürütülür. Gereksiz yeniden başlatmaları (ağ erişiminin tekrarlanması gerekebileceğinden pahalıdır) önlemek için, tüm etiket bağımsız değişkenlerinin mevcut bir dosyaya çözülmesi 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 dize veya etiketten bir yolun çözülmesinin yine de yeniden başlatmaya neden olabileceğini unutmayın.

Son olarak, local olmayan 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 gereken .bzl dosyaları.
  • WORKSPACE dosyasındaki depo kuralının beyanı.
  • repository_rule işlevinin environ özelliğiyle beyan edilen tüm ortam değişkenlerinin 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 etikete referans verilen dosyaların içeriği (ör. //mypkg:label.txt, mypkg/label.txt değil).

Harici depoların yeniden getirilmesini zorlama

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

Ayrıca, bazı kurallar yerel makineyi inceler ve yerel makine yükseltilirse güncelliğini yitirebilir. Burada bazel'den yalnızca repository_rule tanımında configure özelliğinin ayarlandığı harici depoları yeniden getirmesini isteyebilirsiniz. bazel sync --configure değerini kullanın.

Örnekler

  • C++ otomatik yapılandırılmış araç seti: Yerel C++ derleyiciyi, ortamı ve C++ derleyicinin desteklediği işaretçileri 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 üzere çeşitli repository_rule öğelerini 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ı ürünü için derleme hedefleri oluşturur.