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, attrs
kural bağımsız değişkenine dikt olarak iletilen kural bağımsız değişkenleridir.
Özellikler ve türleri, bir depo kuralı tanımladığınızda listelenir. url
ve sha256
özelliklerini dize olarak tanımlayan bir örnek:
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>
öğesini kullanın:
def _impl(repository_ctx):
url = repository_ctx.attr.url
checksum = repository_ctx.attr.sha256
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?
Bir deponun uygulama işlevi, Bazel'in o depodan bir hedefe ihtiyacı olduğunda yürütülür. Örneğin, başka bir hedef (başka bir depoda) bu depoya bağlı olduğunda veya komut satırında bu depodan bahsedildiğinde uygulama işlevi yürütülür. Daha sonra uygulama işlevinin, dosya sisteminde depoyu oluşturması beklenir. Buna depoyu "getirme" denir.
Normal hedeflerin aksine depolar, deponun farklı olmasına neden olacak bir değişiklik olduğunda mutlaka yeniden getirilmez. Bunun nedeni, Bazel'in değişiklikleri algılayamadığı veya her derlemede çok fazla ek yüke (örneğin, ağdan getirilen şeyler) neden olacağıdır. Bu nedenle, depolar yalnızca aşağıdaki durumlardan biri değiştiğinde yeniden getirilir:
WORKSPACE
dosyasındaki depo bildirimine iletilen parametreler.- Deponun uygulanmasını içeren Starlark kodu.
repository_ctx
öğesiningetenv()
yöntemine iletilen veyarepository_rule
öğesininenviron
özelliğiyle bildirilen herhangi bir ortam değişkeninin değeri. Bu ortam değişkenlerinin değerleri,--repo_env
işareti kullanılarak komut satırına kabloyla bağlanabilir.read()
veexecute()
içine iletilen herhangi bir dosyanın içeriği ve bir etiket tarafından başvuruda bulunulanrepository_ctx
benzer yöntemleri (örneğin,//mypkg:label.txt
ancakmypkg/label.txt
değil)bazel sync
yürütüldüğünde.
Depoların ne zaman yeniden getirileceğini kontrol eden iki repository_rule
parametresi vardır:
configure
işareti ayarlanırsa depo, yalnızcabazel sync
adresinde--configure
parametresi iletildiğinde yeniden getirilir (özellik ayarlanmadan bırakılırsa bu komut yeniden getirmeyi sağlamaz).local
işareti ayarlanırsa yukarıdaki durumlara ek olarak depo, Bazel sunucusu yeniden başlatıldığında veya depo değişikliklerinin bildirimini etkileyen herhangi bir dosya (ör.WORKSPACE
dosyası ya da yüklediği bir dosya) olduğunda da yeniden getirilir.Yerel olmayan depolar bu durumlarda yeniden getirilmez. Bunun nedeni, bu depoların ağ ile iletişim kuracağının veya başka şekilde pahalı olacağının düşünülmesidir.
Uygulama işlevini yeniden başlatma
İstekte bulunduğu bir bağımlılık eksikse kod deposu getirilirken uygulama işlevi yeniden başlatılabilir. Bu durumda, uygulama işlevinin yürütülmesi durdurulur, eksik olan bağımlılık çözülür ve bağımlılık çözüldükten sonra işlev yeniden yürütülür. Gereksiz yeniden başlatmalardan kaçınmak (ağ erişiminin tekrarlanması gerekebileceği için pahalıdır) ve 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.
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.