Dış bağımlılıklarla ilgili ileri düzey konular

Sorun bildir Kaynağı göster

WORKSPACE'te bağımlılıkları gölgelendirme

Mümkün olduğunda projenizde tek bir sürüm politikası oluşturun. Bu politika, derlediğiniz bağımlılıklar için gerekli olup son ikili programınıza eklenir. Diğer durumlarda bağımlılıkları gölgeleyebilirsiniz:

projem/WORKSPACE

workspace(name = "myproject")

local_repository(
    name = "A",
    path = "../A",
)
local_repository(
    name = "B",
    path = "../B",
)

A/WORKSPACE

workspace(name = "A")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "...",
)

B/ÇALIŞMA ALANI

workspace(name = "B")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)

Hem A hem de B bağımlılığı farklı testrunner sürümlerine bağlıdır. myproject/WORKSPACE içinde farklı adlar vererek her ikisini de çakışma olmadan myproject içine dahil edin:

workspace(name = "myproject")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner-v1",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "..."
)
http_archive(
    name = "testrunner-v2",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)
local_repository(
    name = "A",
    path = "../A",
    repo_mapping = {"@testrunner" : "@testrunner-v1"}
)
local_repository(
    name = "B",
    path = "../B",
    repo_mapping = {"@testrunner" : "@testrunner-v2"}
)

Bu mekanizmayı elmasları birleştirmek için de kullanabilirsiniz. Örneğin, A ve B aynı bağımlılığa sahipse ancak farklı adlarla çağırıyorsa bu bağımlılıkları myproject/WORKSPACE içinde birleştirin.

Komut satırından depoları geçersiz kılma

Beyan edilen depoyu komut satırından yerel bir depoyla geçersiz kılmak için --override_repository işaretini kullanın. Bu işareti kullandığınızda, kaynak kodunuzu değiştirmeden harici depoların içeriği değiştirilir.

Örneğin, @foo parametresini /path/to/local/foo yerel dizinine geçersiz kılmak için --override_repository=foo=/path/to/local/foo işaretini iletin.

Kullanım alanları aşağıdakileri içerir:

  • Hata ayıklama sorunları. Örneğin, bir http_archive deposunu daha kolay değişiklik yapabileceğiniz yerel bir dizinle geçersiz kılabilirsiniz.
  • Tedarikçi firma. Ağ çağrıları yapamadığınız bir ortamdaysanız ağ tabanlı depo kurallarını yerel dizinlere işaret edecek şekilde geçersiz kılın.

Proxy kullanma

Bazel, HTTPS_PROXY ve HTTP_PROXY ortam değişkenlerinden proxy adreslerini alıp HTTP ve HTTPS dosyalarını indirmek için bunları kullanır (belirtilirse).

IPv6 desteği

Yalnızca IPv6 kullanan makinelerde Bazel, hiçbir değişiklik yapmadan bağımlılıkları indirebilir. Ancak çift yığınlı IPv4/IPv6 makinelerinde Bazel, Java ile aynı kuralı uygular ve etkinleştirilmesi durumunda IPv4'ü tercih eder. Bazı durumlarda, örneğin IPv4 ağının harici adreslere çözümleyemediği/ulaşamadığı durumlarda bu, Network unreachable istisnalarına ve derleme hatalarına yol açabilir. Bu gibi durumlarda, java.net.preferIPv6Addresses=true sistem özelliğini kullanarak Bazel'ın davranışını IPv6'yı tercih edecek şekilde geçersiz kılabilirsiniz. Özellikle:

  • --host_jvm_args=-Djava.net.preferIPv6Addresses=true başlangıç seçeneğini kullanın. Örneğin, .bazelrc dosyanıza aşağıdaki satırı ekleyerek:

    startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true

  • İnternet'e bağlanması gereken Java derleme hedeflerini (ör. entegrasyon testleri için) çalıştırırken --jvmopt=-Djava.net.preferIPv6Addresses=true araç işaretini kullanın. Örneğin, .bazelrc dosyanıza şunları ekleyin:

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • Bağımlılık sürümünün çözümlenmesi için rules_jvm_external kullanıyorsanız Coursier için JVM seçenekleri sağlamak amacıyla COURSIER_OPTS ortam değişkenine de -Djava.net.preferIPv6Addresses=true ekleyin.

Çevrimdışı derlemeler

Bazen (örneğin, uçakta seyahat ederken) bir binayı çevrimdışı olarak çalıştırmak isteyebilirsiniz. Bu tür basit kullanım alanları için gerekli depoları bazel fetch veya bazel sync ile önceden getirin. Derleme sırasında daha fazla depoyu getirmeyi devre dışı bırakmak için --nofetch seçeneğini kullanın.

Farklı bir varlığın gerekli tüm dosyaları sağladığı gerçek çevrimdışı derlemeler için Bazel --distdir seçeneğini destekler. Bu işaret, bir depo kuralı Bazel'dan ctx.download veya ctx.download_and_extract içeren bir dosya getirmesini istediğinde Bazel'a bu seçenekle belirtilen dizinlere ilk olarak bakmasını bildirir. Bazel, gereken dosyanın karma toplamını sağlayarak ilk URL'nin temel adıyla eşleşen bir dosya arar ve karma eşleşirse yerel kopyayı kullanır.

Bazel, dağıtım yapısından çevrimdışı önyükleme yapmak için bu tekniği kullanır. Bunu, gerekli tüm dış bağımlılıkları dahili bir distdir_tarda toplayarak yapar.

Bazel, ağa çağrı yapıp yapmadıklarını bilmeden depo kurallarında rastgele komutların yürütülmesine izin verir ve bu nedenle tamamen çevrimdışı derlemeleri zorunlu kılamaz. Bir derlemenin çevrimdışı düzgün çalışıp çalışmadığını test etmek için ağı manuel olarak engelleyin (Bazel'ın önyükleme testinde yaptığı gibi).