Bu sayfada kod deposu kurallarının nasıl oluşturulacağı ele alınmakta 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şlemleri etkinleştiren bir kuraldır. Her harici depo kuralı, kendi BUILD
dosyaları ve yapılarıyla kendi çalışma alanı oluşturur. Üçüncü taraf kitaplıklara (ör. Maven paketlenmiş kitaplıkları) bağlı kalmanın yanı sıra Bazel'in çalıştığı ana makineye özel BUILD
dosyaları oluşturmak için de kullanılabilirler.
Kod deposu kuralı oluşturma
Bir .bzl
dosyasında yeni bir depo kuralı oluşturmak ve bu kuralı genel değişkende depolamak için repository_rule işlevini kullanın.
Özel depo kuralları, yerel depo kuralları gibi kullanılabilir. Zorunlu bir name
özelliğine sahiptir ve derleme dosyalarında bulunan her hedef @<name>//package:target
olarak kabul edilebilir. Burada <name>
, name
özelliğinin değeridir.
Kural, açık bir şekilde derlediğinizde veya derlemenin bir bağımlılığıysa yüklenir. Bu durumda, Bazel implementation
işlevini yürütür. Bu işlevde deponun, içeriğinin ve BUILD
dosyalarının nasıl oluşturulacağını 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>
özelliğini kullanın.
Tüm repository_rule
'ler, dolaylı olarak tanımlanmış özelliklere sahiptir (derleme kuralları gibi). İki örtülü özellik, name
(oluşturma kurallarında olduğu gibi) ve repo_mapping
'dir. Depo kuralının adına repository_ctx.name
ile erişilebilir. repo_mapping
öğesinin anlamı, yerel depo kuralları local_repository
ve new_local_repository
ile aynıdır.
Özellik adı _
ile başlıyorsa gizlidir ve kullanıcılar bu özelliği ayarlayamaz.
Uygulama işlevi
Her kod deposu kuralı bir implementation
işlevi gerektirir. Kuralın gerçek mantığını içerir ve kesinlikle Yükleme Aşamasında yürütülür.
İşlev tam olarak bir giriş parametresine (repository_ctx
) sahiptir. İşlev, belirtilen parametrelere göre kuralın yeniden oluşturulabilir olduğunu belirtmek için None
veya kuralı, aynı depoyu oluşturan tekrarlanabilir bir kurala dönüştürecek bir dizi parametre içeren dikte döndürür. Örneğin, git deposunu izleyen bir kural için başlangıçta belirtilen kayan dal yerine belirli bir kaydetme tanımlayıcısı döndürmeniz gerekir.
repository_ctx
giriş parametresi, özellik değerlerine ve hermetik olmayan işlevlere (ikili program bulma, ikili program yürütme, depoda dosya oluşturma veya internetten dosya indirme) erişmek için kullanılabilir. Daha fazla bağlam 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ı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. 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ği için pahalıdır) önlemek için tüm etiket bağımsız değişkenlerinin mevcut bir dosyada çö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 gelen bir yolun çözümlenmesinin yine de yeniden başlatmaya neden olabileceğini unutmayın.
Son olarak, local
dışı 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 bildirimi.repository_rule
işlevininenviron
özelliğiyle tanımlanan herhangi bir ortam değişkeninin değeri. Bu ortam değişkeninin değeri, komut satırından--action_env
işaretiyle zorunlu kılınabilir (ancak bu işaret, derlemenin her işlemini geçersiz kılar).- Etiketin kullandığı ve atıfta bulunduğu herhangi bir dosyanın içeriği (ör.
mypkg/label.txt
değil//mypkg:label.txt
).
Harici depoların yeniden getirilmesini zorunlu kılma
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, depo getirme kaynakları, üçüncü taraf deposunun belirli bir dalını izleyebilir ve bu dalda yeni kaydetme işlemleri kullanılabilir. Bu durumda, bazel sync
çağrısı yaparak bazel'dan 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'dan yalnızca repository_rule
tanımında configure
özelliğinin ayarlı olduğu harici depoları yeniden getirmesini isteyebilirsiniz. bazel sync --configure
kullanın.
Örnekler
C++ otomatik yapılandırılmış araç zinciri: Yerel C++ derleyicisine, ortama ve C++ derleyicisinin desteklediği işaretlere bakarak 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 geçişli bağımlılık ağacındaki her Maven yapısı için derleme hedefleri oluşturan
@maven
adlı harici bir depo oluşturur.