Tedarikçi Modu

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 .

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.

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.