Tedarikçi modu, harici bağımlılıkların yerel bir kopyasını oluşturmanıza olanak tanıyan Bzlmod özelliğidir. Bu, çevrimdışı derlemeler veya harici bir bağımlılık kaynağını kontrol etmek istediğinizde kullanışlıdır.
Tedarikçi modunu etkinleştirme
--vendor_dir
işaretini belirterek tedarikçi 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ı kök dizininize göre göreli bir yol veya mutlak bir yol olabilir.
Satıcıya belirli bir harici depo
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, koşu:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
veya
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+
<workspace root>/vendor_src/rules_cc+
altında vendored olarak rules_cc değerini alır.
Belirli hedefler için tedarikçi firmanın harici bağımlılıkları
Belirli hedef kalıpları oluşturmak için gereken tüm harici bağımlılıkları tedarikçi firmaya 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
hedefini ve //src/test/...
altındaki tüm hedefleri mevcut yapılandırmayla oluşturmak için gereken tüm depoları tedarikçiye gönderir.
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
Tedarikçi firma tarafından sağlanan harici bağımlılıklarla 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, tedarikçi kaynakta kontrol yapabilir ve aynı hedefleri başka bir makinede çevrimdışı olarak derleyebilirsiniz.
Tüm harici bağımlılıkları tedarikçi firma
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çiye aktarmanın birkaç dezavantajı olduğunu unutmayın:
- Geçiş yoluyla tanıtılanlar da dahil olmak üzere tüm depoları getirme işlemi 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 firma modunu yapılandırma
Belirli depoların nasıl kullanılacağını, tedarikçi dizininin altındaki VENDOR.bazel dosyasıyla kontrol edebilirsiniz.
Her ikisi de bağımsız değişken olarak kanonik depo adlarının listesini kabul eden iki yönerge vardır:
ignore()
: ile bir deposu tedarikçi modunda tamamen yoksayabilirsiniz.pin()
: Bir deposu, bu depo için--override_repository
işareti varmış gibi mevcut tedarikçi 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 reponun tedarikçi kaynaklarını manuel olarak değiştirebilir ve yönetebilir.
Örneğin:
ignore("@@rules_cc+")
pin("@@bazel_skylib+")
Bu yapılandırmayla
- Her iki depo da sonraki tedarikçi komutlarından hariç tutulur.
bazel_skylib
deposu, tedarikçi dizininin altında bulunan kaynakla geçersiz kılınır.- Kullanıcı,
bazel_skylib
tedarikçi kaynaklarını güvenli bir şekilde değiştirebilir. bazel_skylib
'ü yeniden tedarikçiye vermek için kullanıcının önce PIN beyanını devre dışı bırakması gerekir.
Tedarikçi modunun işleyiş şeklini anlama
Bazel, $(bazel info
output_base)/external
altında bir projenin harici bağımlı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.
Tedarikçi firmaya sağlanan içerikler şunlardır:
- Depo dizini
- Depo işaretleyici dosyası
Derleme sırasında, tedarikçi firma 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 bu dosyaya yönelik bir sembolik bağlantı oluşturarak tedarikçi firma kaynağını 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 dosyaları
Bazel'in harici bağımlılıkları almak için Bazel modülü çözümlemesini gerçekleştirmesi gerekir. Bu işlem, kayıt defteri dosyalarına internet üzerinden erişmeyi gerektirebilir. Bazel, çevrimdışı derleme elde etmek için ağdan alınan tüm kayıt defteri dosyalarını <vendor_dir>/_registries
dizininde saklar.
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
dosyasını işaret eden bir sembolik bağlantı<vendor_dir>/bazel-external
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.