Bu sayfada kod deposu kurallarının nasıl oluşturulacağı açıklanır ve inceleyebilirsiniz.
Harici depo, yalnızca
WORKSPACE
dosyasıdır ve yükleme aşamasında hermetik olmayan işlemi etkinleştirir.
elde etti. Her harici depo kuralı, kendi çalışma alanını ve
BUILD
dosyalarına ve yapısına sahip olabilir. Üçüncü taraflara bağımlı olmak için
kitaplıklarını (Maven paketlenmiş kitaplıkları gibi) yanı sıra BUILD
dosyası oluşturmayı da sağlar.
ana makineye özgü olduğunu unutmayın.
Depo kuralı oluşturma
.bzl
dosyasında
Yeni bir kod oluşturmak için repository_rule
kod deposu kuralına ekleyin ve bunu bir genel değişkende depolayın.
Özel depo kuralı, yerel depo kuralı gibi kullanılabilir. Google
zorunlu bir name
özelliğine ve derleme dosyalarında bulunan her hedefe sahiptir
@<name>//package:target
olarak ifade edilebilir. Burada <name>
,
name
özelliği için de kullanılmaktadır.
Kural, açıkça derlediğinizde yüklenir.
seçeceğim. Bu durumda, Bazel implementation
işlevini yürütür. Bu
fonksiyonunda deponun, içeriğinin ve BUILD
dosyalarının nasıl oluşturulacağını açıklanır.
Özellikler
Özellik, url
veya sha256
gibi bir kural bağımsız değişkenidir. Şunları listelemelisiniz:
özelliklerini ve türlerini tanımlamaya çalışın.
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
'lar, örtülü olarak tanımlanmış özelliklere sahiptir (tıpkı
kuralları) belirlemeye olanak tanır. İki örtülü özellik şunlardır: name
(tıpkı derleme kurallarında olduğu gibi) ve
repo_mapping
. Bir depo kuralının adına şu kişiler dahildir:
repository_ctx.name
repo_mapping
kelimesinin anlamı
yerel depo kuralları
local_repository
ve
new_local_repository
.
Ö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. Belge,
yükleme Aşamasında tam olarak yürütülür.
İşlev, repository_ctx
adlı tam bir giriş parametresine sahiptir. İşlev
kuralın tekrarlanabilir olduğunu belirtmek için None
değerini döndürür
veya bu kural için bir dizi parametre içeren bir dikte
kuralı, aynı depoyu oluşturan tekrarlanabilir bir kurala dönüştürür. Örneğin,
Örneğin, Git deposunu izleyen bir kural için
ilk başta bu değerde olan kayan bir dal yerine belirli bir taahhüt tanımlayıcısı
belirtiliyor.
repository_ctx
giriş parametresi şu amaçlar için kullanılabilir:
erişim özellik değerlerine ve hermetik olmayan işlevlere (ikili program,
ikili program yürütme, depoda dosya oluşturma veya dosya indirme
daha fazla içerik sunar. Daha fazla bilgi için kitaplığa göz atın
daha yakından inceleyeceğiz. Ö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ığı değiştirin
bağımlılık grafiğinde (WORKSPACE
dosyasının kendisi de dahil)
uygulama işlevinin yürütülmesine neden olur.
Bir bağımlılık varsa uygulama işlevi yeniden başlatılabilir isteklerin eksik olması. Uygulama işlevinin başlangıcı dosyası, bağımlılık çözüldükten sonra yeniden yürütülür. Kaçınılması gerekenler (ağ erişimi, kötü amaçlı yazılımdan kaynaklanan nedenlere bağlı olarak tekrarlanması gerekiyorsa) etiket bağımsız değişkenleri, tüm standart etiket bağımsız değişkenleri mevcut bir dosyaya çözümlenebilir. Sorun çözüldüğünde, yalnızca yürütme sırasında oluşturulan bir dizeden veya etiketten alınan yol işlevin yeniden başlatılması yeniden başlatmaya neden olabilir.
Son olarak, local
dışı depolar için yalnızca aşağıdaki
bazı temel işlemler yeniden başlatmaya neden olabilir:
- Depo kuralını tanımlamak için
.bzl
dosya gerekiyor. WORKSPACE
dosyasında depo kuralının beyanı.environ
ile tanımlanan herhangi bir ortam değişkeninin değeri özelliğininrepository_rule
işlevini kullanın. Bu ortam değişkeninin değeri komut satırından--action_env
(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, şurada herhangi bir değişiklik yapılmadan güncelliğini yitirebilir:
ve bağımlılıklarını
anlamanıza yardımcı olur. Örneğin depodan gelen kaynaklar
bir üçüncü taraf deposunun belirli bir dalını takip edebilir ve
üzerinden erişilebilir. Bu durumda, bazel'dan tüm
harici depoları koşulsuz olarak bazel sync
çağırarak yeniden gönderin.
Ayrıca, bazı kurallar yerel makineyi denetler ve
yerel makine yeni sürüme geçirildiyse güncel değildir. Burada, Bazel'dan şunları yapmasını isteyebilirsiniz:
yalnızca
repository_rule
tanımında configure
özellik ayarlanmış, bazel sync --configure
kullanın.
Örnekler
C++ otomatik yapılandırılmış araç zinciri: bir depo kuralı kullanır. Yerel C++ derleyicisi olan Bazel için C++ yapılandırma dosyalarını ortamı ve C++ derleyicisinin desteklediği işaretler.
Go depoları bağımlılık listesini tanımlamak için birkaç
repository_rule
kullanır gereken tüm bilgileri içerir.rules_jvm_external oluşturma varsayılan olarak
@maven
adlı ve derleme hedefleri oluşturan harici bir depo geçişli bağımlılık ağacındaki her Maven yapısı için geçerlidir.