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

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

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

Mümkün olduğunda projenizde tek bir sürüm politikası kullanın. Bu, derlediğiniz ve nihai ikili dosyanızda yer alan bağımlılıklar için gereklidir. Diğer durumlarda bağımlılıkları gölgeleyebilirsiniz:

myproject/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ümlerine bağlıdır. myproject'da her ikisini de çakışma olmadan eklemek için myproject/WORKSPACE'da bunlara farklı adlar verin:

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"}
)

Elmasları birleştirmek için de bu mekanizmayı 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.

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

Bildirilmiş bir depoyu komut satırından yerel bir depoyla geçersiz kılmak için --override_repository işaretini kullanın. Bu işaretin kullanılması, 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ı:

  • Sorunları ayıklama. Örneğin, değişiklikleri daha kolay yapabileceğiniz bir yerel dizine http_archive deposunu geçersiz kılmak için.
  • Vendoring. Ağ araması yapamayacağınız bir ortamdaysanız ağ tabanlı depo kurallarını geçersiz kılarak bunun yerine yerel dizinleri işaret edin.

Proxy kullanma

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

IPv6 desteği

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

  • --host_jvm_args=-Djava.net.preferIPv6Addresses=true startup option'ı kullanın. Örneğin, .bazelrc dosyanıza aşağıdaki satırı ekleyin:

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

  • İnternete bağlanması gereken Java derleme hedefleri (ör. entegrasyon testleri için) çalıştırırken --jvmopt=-Djava.net.preferIPv6Addresses=true tool flag'i kullanın. Örneğin, .bazelrc dosyanıza aşağıdakileri ekleyin:

    build --jvmopt=-Djava.net.preferIPv6Addresses

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

Çevrimdışı derlemeler

Bazen, örneğin uçakla seyahat ederken derlemeyi ç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 getirme işlemini devre dışı bırakmak için --nofetch seçeneğini kullanın.

Gerekli tüm dosyaların farklı bir tüzel kişi 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'in önce bu seçenekle belirtilen dizinlere bakmasını söyler. Gerekli dosyanın karma toplamını sağlayarak Bazel, 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ıtından çevrimdışı olarak başlatmak için bu tekniği kullanır. Bu işlem, gerekli tüm harici bağımlılıkları dahili bir distdir_tar içinde toplayarak yapılır.

Bazel, depodaki kurallarda rastgele komutların yürütülmesine izin verir ancak bu komutların ağa bağlanıp bağlanmadığını bilmediği için tamamen çevrimdışı derlemeleri zorunlu kılamaz. Bir derlemenin çevrimdışı olarak doğru şekilde çalışıp çalışmadığını test etmek için ağı manuel olarak engelleyin (Bazel, bootstrap testinde yaptığı gibi).