Tedarikçi Modu

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Tedarikçi modu, Bzlmod'un harici bağımlılıkların yerel bir kopyasını oluşturmanıza olanak tanıyan bir özelliğidir. Bu, çevrimdışı derlemeler için veya harici bir bağımlılığın kaynağını kontrol etmek istediğinizde kullanışlıdır.

Tedarikçi modunu etkinleştirme

--vendor_dir işaretini belirterek satı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ı satıcıya 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 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 işlem, hedef kalıpları analiz etmek için arka planda bir bazel build --nobuild komutu çalıştırır. Bu nedenle, bu komuta derleme işaretleri uygulanabilir ve sonuç etkilenebilir.

Hedefi çevrimdışı olarak oluşturma

Dış bağımlılıklar satıcıya ait olduğunda, 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, 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

Belirli depoların nasıl işleneceğini, vendor dizini altındaki VENDOR.bazel dosyasıyla 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 öğesini 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 daha 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.

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ğlayıcıdan alınan kaynak için, başlangıçta $(bazel info output_base)/external altındaki bir yola 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, kontrol edilmesini önlemek için .gitignore veya eşdeğerine eklemeniz önerilir.

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 kaynakta bulunan sembolik bağlantılar doğru şekilde çalışır.