Bu sayfada, depo kurallarının nasıl oluşturulacağı açıklanmakta ve daha fazla bilgi için örnekler verilmektedir.
Harici depo, yalnızca WORKSPACE
dosyasında kullanılabilen ve Bazel'in yükleme aşamasında hermetik olmayan işleme olanak tanıyan bir kuraldır. Her harici depo kuralı, kendi BUILD
dosyaları ve yapıtlarıyla kendi çalışma alanını oluşturur. Üçüncü taraf kitaplıklara (ör. Maven paketli kitaplıklar) bağımlı olmak için ve Bazel'in üzerinde çalıştığı ana makineye özel BUILD
dosyaları oluşturmak için kullanılabilirler.
Depo kuralı oluşturma
.bzl
dosyasında, yeni bir depo kuralı oluşturmak ve bunu genel bir 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ği vardır ve derleme dosyalarında bulunan her hedef, @<name>//package:target
olarak adlandırılabilir. Burada <name>
, name
özelliğinin değeridir.
Kural, açıkça oluşturduğunuzda veya derlemenin bağımlılığı olduğunda yüklenir. Bu durumda Bazel, implementation
işlevini yürütür. Bu işlev, depoyu, 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
'lerin örtülü olarak tanımlanmış özellikleri vardır (tıpkı derleme kurallarında olduğu gibi). İki örtülü özellik vardır: name
(derleme kurallarında olduğu gibi) ve repo_mapping
. 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ı anlama gelir.
Bir özellik adı _
ile başlıyorsa bu özellik özeldir ve kullanıcılar tarafından ayarlanamaz.
Uygulama işlevi
Her depo kuralı için implementation
işlevi gerekir. Kuralın gerçek mantığını içerir ve kesinlikle yükleme aşamasında yürütülür.
İşlevin tam olarak bir giriş parametresi vardır: repository_ctx
. İşlev, belirtilen parametreler göz önüne alındığında kuralın yeniden üretilebilir olduğunu belirtmek için None
değerini veya bu kuralı aynı depoyu oluşturacak şekilde yeniden üretilebilir bir kurala dönüştürecek bir dizi parametre içeren bir sözlük döndürür. Örneğin, bir Git deposunu izleyen bir kural için bu, başlangıçta belirtilen kayan dal yerine belirli bir commit tanımlayıcısının döndürülmesi anlamına gelir.
Giriş parametresi repository_ctx
, özellik değerlerine erişmek ve hermetik olmayan işlevler (ikili dosya bulma, ikili dosya yürütme, depoda dosya oluşturma veya internetten dosya indirme) 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ımlanmışsa bağımlılık grafiğindeki bir bağımlılıkta (WORKSPACE
dosyası dahil) yapılan değişiklik, uygulama işlevinin yürütülmesine neden olur.
İstenen 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 maliyetli olabilir) önlemek için, tüm etiket bağımsız değişkenleri mevcut bir dosyaya çözümlenebiliyorsa etiket bağımsız değişkenleri önceden getirilir. Yalnızca işlev yürütülürken oluşturulan bir dizeden veya etiketten yolu çözmenin yine de yeniden başlatmaya neden olabileceğini unutmayın.
Son olarak, local
olmayan depolarda yalnızca aşağıdaki bağımlılıklarda yapılan değişiklikler yeniden başlatmaya neden olabilir:
- Depo kuralını tanımlamak için
.bzl
dosyaları gerekir. 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şkenlerinin 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).- Bir plak şirketi tarafından kullanılan ve referans verilen tüm dosyaların içeriği (ör.
//mypkg:label.txt
değilmypkg/label.txt
).
Harici depoların yeniden getirilmesini zorlama
Bazen, tanımında veya bağımlılıklarında herhangi bir değişiklik yapılmadan harici bir depo eski hale gelebilir. Örneğin, kaynakları getiren bir depo, üçüncü taraf deposunun belirli bir dalını takip edebilir ve bu dalda yeni işlemeler kullanılabilir. Bu durumda, bazel sync
işlevini çağırarak 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ği ayarlanmış harici depoları yeniden getirmesini isteyebilirsiniz. Bunun için bazel sync --configure
kullanın.
Örnekler
C++ otomatik yapılandırılmış araç zinciri: Yerel C++ derleyicisini, ortamı ve C++ derleyicisinin 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 üzere çeşitli
repository_rule
kullanır.rules_jvm_external, varsayılan olarak
@maven
adlı bir harici 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.