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

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

Workspace'te bağımlılıkları gölgeleme

Mümkünse projenizde tek bir sürüm politikası kullanın. Bu politika, derlediğiniz ve nihai ikili dosyanızda kullandığınız bağımlılıklar için gereklidir. 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/WORKSPACE

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ıkları, testrunner'nin farklı sürümlerini kullanır. myproject/WORKSPACE'te farklı adlar vererek her ikisini de myproject'e sorunsuz bir şekilde 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 bu bağımlılığı farklı adlarla çağırıyorsa bu bağımlılıkları myproject/WORKSPACE içinde birleştirin.

Depoları komut satırından geçersiz kılma

Komut satırından, bildirilen bir deposu yerel bir depoyla geçersiz kılmak için --override_repository işaretini kullanın. Bu işareti kullanmak, kaynak kodunuzu değiştirmeden harici depoların içeriğini değiştirir.

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

Kullanım alanları şunlardır:

  • Sorunları ayıklama. Örneğin, bir http_archive deposunu, değişiklikleri daha kolay yapabileceğiniz yerel bir dizinle geçersiz kılmak için.
  • Tedarikçi firma Ağ çağrısı yapamadığınız bir ortamdaysanız ağ tabanlı depolama alanı kurallarını geçersiz kılıp yerel dizinleri işaret edecek şekilde değiştirin.

Proxy kullanma

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

IPv6 desteği

Bazel, yalnızca IPv6 kullanan makinelerde bağımlılıkları herhangi bir değişiklik yapmadan indirebilir. Ancak Bazel, çift yığınlı IPv4/IPv6 makinelerde Java ile aynı kuralı uygular ve etkinse IPv4'ü tercih eder. Bazı durumlarda (ör. IPv4 ağı harici adresleri çözemediğinde/buralara ulaşamadığında) bu durum Network unreachable istisnalarına ve derleme hatalarına neden olabilir. Bu gibi durumlarda, java.net.preferIPv6Addresses=true sistem özelliğini kullanarak Bazel'in IPv6'yı tercih etme davranışını geçersiz kılabilirsiniz. Özellikle:

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

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

  • İnternete bağlanması gereken Java derleme hedeflerini (entegrasyon testleri gibi) ç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ü çözümü için rules_jvm_external kullanıyorsanız Coursier için JVM seçenekleri sağlamak amacıyla COURSIER_OPTS ortam değişkenine -Djava.net.preferIPv6Addresses=true da ekleyin.

Çevrimdışı derlemeler

Bazen, uçakta seyahat ederken olduğu gibi bir derlemeyi çevrimdışı olarak çalıştırmak isteyebilirsiniz. Bu tür basit kullanım alanları için bazel fetch veya bazel sync ile gerekli depoları önceden alın. Derleme sırasında başka depoların getirilmesini devre dışı bırakmak için --nofetch seçeneğini kullanın.

Gerekli tüm dosyaların farklı bir varlık tarafından sağlandığı gerçek çevrimdışı derlemeler için Bazel, --distdir seçeneğini destekler. Bu işaret, bir depo kuralı Bazel'den ctx.download veya ctx.download_and_extract ile bir dosya getirmesini istediğinde Bazel'e önce bu seçenekle belirtilen dizinleri aramasını söyler. 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 de dağıtım yapısını kullanarak çevrimdışı önyükleme yapmak için bu tekniği kullanır. Bunu, gerekli tüm harici bağımlılıkları dahili bir distdir_tar içinde 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ılmaz. Bir derlemenin çevrimdışı olarak düzgün çalışıp çalışmadığını test etmek için ağı manuel olarak engelleyin (Bazel'in önyükleme testinde yaptığı gibi).