Tedarikçi modu, Bzlmod'un dış bağımlılıkların yerel kopyasını oluşturmanıza olanak tanıyan bir özelliktir. Bu, çevrimdışı derlemeler için veya bir harici bağımlılığın kaynağını kontrol etmek istediğinizde kullanışlıdır.
Tedarikçi modunu etkinleştirme
Tedarikçi firma modunu --vendor_dir
işaretini belirterek 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ı kökünüzün göreli bir yolu veya mutlak bir yol olabilir.
Tedarikçiye belirli bir harici depo sağlayın
Tedarikçiye hangi deponun gönderileceğini belirtmek için vendor
komutunu --repo
işaretiyle kullanabilirsiniz. Bu komut hem kanonik depo adını hem de görünür depo adını kabul eder.
Örneğin, şunu çalıştırdığınızda:
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~
kapsamında
tedarik edilecek kurallar_cc alır.
Belirli hedefler için tedarikçi firma harici bağımlılıkları
Belirli hedef kalıpları oluşturmak için gereken tüm harici bağımlılıkları sağlamak amacıyla bazel vendor <target patterns>
çalıştırabilirsiniz.
Örneğin:
bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...
//src/main:hello-world
hedefini ve //src/test/...
altındaki tüm hedefleri mevcut yapılandırmayla oluşturmak için gereken tüm depoları tedarik edecek.
Arka planda, hedef kalıpları analiz etmek için bir bazel build --nobuild
komutu çalıştırılır. Bu nedenle, bu komuta derleme işaretleri uygulanabilir ve sonuç etkilenebilir.
Hedefi çevrimdışı olarak oluşturma
Harici bağımlılıklar tedarik edince, hedefi çevrimdışı olarak da 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, tedarikçi firma kaynağı kontrol edebilir ve aynı hedefleri başka bir makinede çevrimdışı olarak oluşturabilirsiniz.
Tüm dış bağımlılıkları tedarik etme
Geçişli harici bağımlılık grafiğinizdeki tüm depoları tedarikçi firma olarak eklemek için şunları çalıştırabilirsiniz:
bazel vendor --vendor_dir=vendor_src
Tüm bağımlılıkları tedarik etmenin birkaç dezavantajı olduğunu unutmayın:
- Geçişli olarak eklenenler de dahil olmak üzere tüm depoları getirmek zaman alabilir.
- Tedarikçi dizini çok büyük olabilir.
- Mevcut platform veya ortamla uyumlu olmayan bazı depolar getirilemeyebilir.
Bu nedenle, önce belirli hedefler için tedarikçi kullanmayı düşünün.
VENDOR.bazel ile tedarikçi modunu yapılandırma
Belirli bir deponun nasıl işleneceğini, tedarikçi dizininin altında bulunan VENDOR.bazel dosyasıyla kontrol edebilirsiniz.
Her ikisi de standart depo adlarının listesini bağımsız değişken olarak kabul eden iki yönerge vardır:
ignore()
: ile bir deposu tedarikçi modunda tamamen yoksayabilirsiniz.pin()
: Bir depoyu, bu kod deposu için--override_repository
işareti varmış gibi mevcut tedarikçi firma kaynağına sabitlemek için kullanılır. Bazel, sabitlenmemişse tedarikçi firma komutunu çalıştırırken bu reponun tedarikçi firma kaynağını GÜNCELLEMEZ. Kullanıcı, bu kod deposu için tedarikçi firma kaynağı manuel olarak değiştirip sürdürebilir.
Örneğin:
ignore("@@rules_cc~")
pin("@@bazel_skylib~")
Bu yapılandırmayla
- Her iki depo da sonraki tedarikçi komutlarından hariç tutulacak.
bazel_skylib
kod deposu, tedarikçi firma dizini altında bulunan kaynağa göre geçersiz kılınır.- Kullanıcı, tedarikçi tarafından sağlanan
bazel_skylib
kaynağını güvenli bir şekilde değiştirebilir. bazel_skylib
tedarikçisini yeniden sağlamak için kullanıcının önce PIN ifadesini devre dışı bırakması gerekir.
Tedarikçi modunun işleyiş şeklini anlama
Bazel, $(bazel info
output_base)/external
altındaki bir projenin harici bağımlılıklarını getirir. Harici bağımlılıkları tedarikçiye aktarmak, ilgili dosya ve dizinleri belirli bir tedarikçi dizine taşımak ve sonraki derlemeler için tedarikçi kaynaklarını kullanmak anlamına gelir.
Sağlanan içerik şunları içeriyor:
- Depo dizini
- Depo işaretleyici dosyası
Derleme sırasında, tedarikçi firma tarafından sağlanan işaretçi dosyası güncelse veya depo VENDOR.bazel dosyasına sabitlendiyse Bazel, depo kuralını çalıştırmak yerine $(bazel info output_base)/external
altında bir sembol bağlantısı oluşturarak tedarikçi firma tarafından sağlanan kaynağı kullanır. Aksi takdirde bir uyarı yazdırılır ve Bazel, deponun en son sürümünü getirmeye geçer.
Tedarikçi firma kayıt defteri dosyaları
Bazel'in harici bağımlılıkları getirmek için Bazel modülü çözümlemesini yapması gerekir. Bu işlem, kayıt defteri dosyalarına internet üzerinden erişmeyi gerektirebilir. Çevrimdışı derlemeyi gerçekleştirmek için Bazel, ağdan getirilen tüm kayıt defteri dosyalarını <vendor_dir>/_registries
dizininin altında sunar.
Tedarikçi firma 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 düzgün çalıştığından emin olmak için tedarikçi kaynaktaki sembolik bağlantıları yeniden yazmak üzere aşağıdaki stratejiyi kullanır:
$(bazel info output_base)/external
sembolü olan bir<vendor_dir>/bazel-external
bağlantısı oluşturun. Her Bazel komutu tarafından otomatik olarak yenilenir.- Tedarikçi firma kaynağı 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
Şu şekilde yeniden yazılır:
<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ğu için, kontrol edilmemesi için .gitignore
veya eşdeğerine eklenmesi önerilir.
Bu stratejiyle, tedarikçi kaynak başka bir konuma taşındıktan veya bazel çıkış tabanı değiştirildikten sonra bile tedarikçi kaynaktaki sembolik bağlantılar doğru şekilde çalışır.