Tedarikçi Modu

Sorun bildir Kaynağı görüntüleyin Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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.

Tedarikçi firmaya belirli bir harici depoyu gösterme

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 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'ün 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.

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.