Tedarikçi modu, harici bağımlılıkların yerel bir kopyasını oluşturmanıza olanak tanıyan bir özelliktir. Bu, çevrimdışı derlemeler için veya harici bir bağımlılığın kaynağını kontrol etmek istediğinizde kullanışlıdır.
Satıcı modunu etkinleştirme
--vendor_dir
işaretini belirterek sağlayı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ı satmak ü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 komut, hedef kalıpları analiz etmek için arka planda bazel build --nobuild
komutunu kullandığından derleme işaretleri bu komuta uygulanabilir ve sonucu etkileyebilir.
Hedefi çevrimdışı olarak oluşturma
Dış bağımlılıklar satıcıya ait olduğunda, hedefi çevrimdışı olarak aşağıdaki şekilde oluşturabilirsiniz:
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
vendor dizininde bulunan VENDOR.bazel dosyasıyla belirli depoların nasıl işleneceğini 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
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 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ğlanan kaynak için, başlangıçta
$(bazel info output_base)/external
altındaki bir yolu 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, .gitignore
veya eşdeğerine eklenmesi önerilir. Böylece, kontrol edilmesini önleyebilirsiniz.
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 kaynaktaki sembolik bağlantılar doğru şekilde çalışır.