Tedarikçi modu, Bzlmod'un harici bağımlılıkların yerel bir kopyasını oluşturmanıza olanak tanıyan bir özelliğidir. Bu, çevrimdışı derlemeler için veya harici bir bağımlılığın kaynağını kontrol etmek istediğinizde kullanışlıdır.
Tedarikçi modunu etkinleştirme
--vendor_dir
işaretini belirterek satıcı modunu etkinleştirebilirsiniz.
Örneğin, .bazelrc
dosyanıza ekleyerek:
# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src
Tedarikçi dizini, çalışma alanınızın kök dizinine göreceli bir yol veya mutlak bir yol olabilir.
Belirli bir harici depoyu sağlama
Hangi deponun satıcıya ait olduğunu belirtmek için vendor
komutunu --repo
işaretiyle birlikte kullanabilirsiniz. Bu komut hem standart depo adını hem de görünür depo adını kabul eder.
Örneğin, aşağıdaki komutun çalıştırılması:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
veya
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~
her ikisi de <workspace root>/vendor_src/rules_cc~
altında satılacak rules_cc'yi alır.
Belirli hedefler için tedarikçi harici bağımlılıkları
Belirli hedef kalıpları oluşturmak için gereken tüm harici bağımlılıkları satıcıya göndermek üzere bazel vendor <target patterns>
komutunu çalıştırabilirsiniz.
Örneğin:
bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...
, //src/main:hello-world
hedefinin ve //src/test/...
altındaki tüm hedeflerin mevcut yapılandırmayla oluşturulması için gereken tüm depoları satıcıya gönderecek.
Bu işlem, hedef kalıpları analiz etmek için arka planda bir bazel build --nobuild
komutu çalıştırır. Bu nedenle, bu komuta derleme işaretleri uygulanabilir ve sonuç etkilenebilir.
Hedefi çevrimdışı olarak oluşturma
Dış bağımlılıklar satıcıya ait olduğunda, hedefi çevrimdışı olarak oluşturmak için
bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...
Derleme, ağ erişimi ve depo önbelleği olmadan temiz bir derleme ortamında çalışmalıdır.
Bu nedenle, satıcıdan alınan kaynağı kontrol edebilir ve aynı hedefleri başka bir makinede çevrimdışı olarak oluşturabilirsiniz.
Tüm harici bağımlılıkları satıcıya bildirin.
Geçişli harici bağımlılıklar grafiğinizdeki tüm depoları satıcıya aktarmak için aşağıdaki komutu çalıştırabilirsiniz:
bazel vendor --vendor_dir=vendor_src
Tüm bağımlılıkların tedarik edilmesinin bazı dezavantajları olduğunu unutmayın:
- Geçişli olarak sunulanlar da dahil olmak üzere tüm depoların getirilmesi zaman alabilir.
- Tedarikçi dizini çok büyük olabilir.
- Bazı depolar, mevcut platform veya ortamla uyumlu değilse getirilemeyebilir.
Bu nedenle, önce belirli hedefler için tedarikçi kullanmayı düşünün.
VENDOR.bazel ile tedarikçi modunu yapılandırma
Belirli depoların nasıl işleneceğini, vendor dizini altındaki VENDOR.bazel dosyasıyla kontrol edebilirsiniz.
İki yönerge vardır ve her ikisi de bağımsız değişken olarak standart depo adlarının listesini kabul eder:
ignore()
: Bir depoyu tedarikçi modunda tamamen yok saymak için.pin()
: Bir depoyu, bu depo için--override_repository
işareti varmış gibi mevcut tedarikçi kaynağına sabitlemek için. Bazel, vendor komutunu çalıştırırken bu depo için tedarik edilen kaynağı, sabitlenmemişse GÜNCELLEMEZ. Kullanıcı, bu depo için tedarik edilen kaynağı manuel olarak değiştirebilir ve koruyabilir.
Örneğin:
ignore("@@rules_cc~")
pin("@@bazel_skylib~")
Bu yapılandırmayla
- Her iki depo da sonraki tedarikçi komutlarının dışında tutulur.
- Depo
bazel_skylib
, vendor dizini altındaki kaynakla geçersiz kılınır. - Kullanıcı,
bazel_skylib
'nın satıcı tarafından sağlanan kaynağını güvenli bir şekilde değiştirebilir. bazel_skylib
öğesini yeniden satmak için kullanıcının önce PIN ifadesini devre dışı bırakması gerekir.
Tedarikçi modunun işleyiş şeklini anlama
Bazel, bir projenin harici bağımlılıklarını $(bazel info
output_base)/external
altında getirir. Harici bağımlılıkları satmak, ilgili dosya ve dizinleri belirli bir satıcı dizinine taşımak ve daha sonraki derlemeler için satılan kaynağı kullanmak anlamına gelir.
Satılan içerikler arasında şunlar yer alır:
- Depo dizini
- Depo işaretleyici dosyası
Derleme sırasında, satıcıya ait işaretçi dosyası güncelse veya depo VENDOR.bazel dosyasında sabitlenmişse Bazel, depo kuralını gerçekten çalıştırmak yerine $(bazel info output_base)/external
altında sembolik bağlantı oluşturarak satıcıya ait kaynağı kullanır. Aksi takdirde bir uyarı yazdırılır ve Bazel, deponun en son sürümünü getirmeye geri döner.
Tedarikçi kayıt dosyaları
Bazel'in harici bağımlılıkları getirmek için Bazel modülü çözümlemesi yapması gerekir. Bu işlem için internet üzerinden kayıt dosyalarına erişilmesi gerekebilir. Çevrimdışı derleme gerçekleştirmek için Bazel, ağdan getirilen tüm kayıt dosyalarını <vendor_dir>/_registries
dizinine satar.
Tedarikçi sembolik bağlantıları
Harici depolar, diğer dosyalara veya dizinlere işaret eden sembolik bağlantılar içerebilir. Bazel, sembolik bağlantıların doğru şekilde çalıştığından emin olmak için tedarik edilen kaynakta sembolik bağlantıları yeniden yazmak üzere aşağıdaki stratejiyi kullanır:
<vendor_dir>/bazel-external
konumuna işaret eden bir sembolik bağlantı$(bazel info output_base)/external
oluşturun. Her Bazel komutu tarafından otomatik olarak yenilenir.- Sağlayıcıdan alınan kaynak için, başlangıçta
$(bazel info output_base)/external
altındaki bir yola işaret eden tüm sembolik bağlantıları<vendor_dir>/bazel-external
altındaki göreli bir yola yeniden yazın.
Örneğin, orijinal sembolik bağlantı
<vendor_dir>/repo_foo~/link => $(bazel info output_base)/external/repo_bar~/file
Bu ifade,
<vendor_dir>/repo_foo~/link => ../../bazel-external/repo_bar~/file
burada
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
<vendor_dir>/bazel-external
, Bazel tarafından otomatik olarak oluşturulduğundan, kontrol edilmesini önlemek için .gitignore
veya eşdeğerine eklemeniz önerilir.
Bu stratejiyle, satıcıya ait kaynak başka bir konuma taşındıktan veya Bazel çıkış tabanı değiştirildikten sonra bile satıcıya ait kaynakta bulunan sembolik bağlantılar doğru şekilde çalışır.