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

Sorun bildirin Kaynağı göster

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

Mümkün olduğunda projenizde tek bir sürüm politikasına sahip olun. Bu politika, derlediğiniz ve son ikili programınıza dahil ettiğiniz bağımlılıklar için gereklidir. Diğer durumlarda bağımlılıkları gölgeleyebilirsiniz:

projem/ÇALIŞMA ALANI

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 = "..."
)

A ve B bağımlılarının ikisi de testrunner ürününün farklı sürümlerine bağlıdır. myproject/WORKSPACE içinde farklı adlar vererek her ikisini de çakışmadan myproject öğesine ekleyin:

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 sahip olmasına rağmen farklı adlarla adlandırıyorsa bu bağımlılıkları myproject/WORKSPACE içinde birleştirin.

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

Beyan edilen bir depoyu, komut satırından yerel kod deposuyla 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 öğesini /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ı arasında şunlar yer alır:

  • Hata ayıklama sorunları. Örneğin, http_archive deposunu geçersiz kılarak değişiklikleri daha kolay yapabileceğiniz yerel bir dizin oluşturabilirsiniz.
  • Tedarikçi firma. Ağ çağrıları yapamayacağınız bir ortamdaysanız bunun yerine 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ır ve bunları, HTTP ve HTTPS dosyalarını (belirtilmişse) indirmek için kullanır.

IPv6 desteği

Yalnızca IPv6 kullanan makinelerde Bazel, bağımlılıkları değişiklik yapmadan indirebilir. Ancak Bazel, çift yığınlı IPv4/IPv6 makinelerinde Java ile aynı kuralı izler ve etkinleştirilirse IPv4'ü tercih eder. Bazı durumlarda, örneğin IPv4 ağının harici adreslere çözümleyemediği veya bu adreslere erişemediği durumlarda 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 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 aşağıdaki satırı .bazelrc dosyanıza ekleyin:

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

  • İnternete bağlanması gereken Java derleme hedeflerini çalıştırırken (örneğin entegrasyon testleri için) --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ümlemesi 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 ekleyin.

Çevrimdışı derlemeler

Bazen, örneğin uçakta seyahat ederken bir yapıyı ç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 depo 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. Bir depo kuralı, Bazel'dan ctx.download veya ctx.download_and_extract içeren bir dosya getirmesini istediğinde, bu işaret Bazel'a önce bu seçeneğin belirttiği dizinlere bakmasını bildirir. Gerekli dosyanın karma toplamını sağlayarak Bazel, ilk URL'nin temel adıyla eşleşen dosyayı arar ve karma değer 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 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 olanak tanır ve bu nedenle tam çevrimdışı derlemeleri uygulayamaz. 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).