Bazel, diğer projelerdeki hedeflere bağlı olabilir. Bu diğer projelerdeki bağımlılıklara dış bağımlılıklar denir.
Çalışma alanı dizinindeki WORKSPACE dosyası (veya WORKSPACE.bazel dosyası), Bazel'a diğer projelerin kaynaklarını nasıl alacağını söyler. Bu diğer projeler, kendi hedefleri olan bir veya daha fazla BUILD dosyası içerebilir. Ana proje içindeki BUILD dosyaları, WORKSPACE dosyasındaki adlarını kullanarak bu harici hedeflere bağlı olabilir.
Örneğin, bir sistemde iki proje olduğunu varsayalım:
/
home/
user/
project1/
WORKSPACE
BUILD
srcs/
...
project2/
WORKSPACE
BUILD
my-libs/
project1, /home/user/project2/BUILD içinde tanımlanan bir hedef olan :foo'e bağlı olmak istiyorsa project2 adlı bir deponun /home/user/project2 konumunda bulunabileceğini belirtebilir. Ardından, /home/user/project1/BUILD içindeki hedefler @project2//:foo'e bağlı olabilir.
WORKSPACE dosyası, kullanıcıların dosya sisteminin diğer bölümlerindeki veya internetten indirilen hedeflere bağlı olmasına olanak tanır. BUILD dosyalarıyla aynı söz dizimini kullanır ancak depo kuralları (bazen çalışma alanı kuralları olarak da bilinir) adı verilen farklı bir kural grubuna izin verir. Bazel'de birkaç yerleşik depo kuralı ve bir dizi yerleştirilmiş Starlark depo kuralı bulunur.
Kullanıcılar, daha karmaşık davranışlar elde etmek için özel depo kuralları da yazabilir.
Desteklenen harici bağımlılık türleri
Birkaç temel harici bağımlılık türü kullanılabilir:
- Diğer Bazel projelerine bağımlılıklar
- Bazel olmayan projelere bağımlılıklar
- Harici paketlere bağımlılıklar
Diğer Bazel projelerine bağlı olma
İkinci bir Bazel projesindeki hedefleri kullanmak istiyorsanız yerel dosya sisteminden sembolik bağlantı oluşturmak, bir Git deposuna referans vermek veya indirmek için (sırasıyla) local_repository, git_repository ya da http_archive kullanabilirsiniz.
Örneğin, my-project/ projesinde çalıştığınızı ve iş arkadaşınızın coworkers-project/ projesindeki hedeflere bağlı kalmak istediğinizi varsayalım. Her iki proje de Bazel'i kullanır. Bu nedenle, iş arkadaşınızın projesini harici bağımlılık olarak ekleyebilir ve ardından iş arkadaşınızın tanımladığı hedefleri kendi BUILD dosyalarınızdan kullanabilirsiniz. my_project/WORKSPACE alanına aşağıdakileri ekleyebilirsiniz:
local_repository(
name = "coworkers_project",
path = "/path/to/coworkers-project",
)
İş arkadaşınızın hedefi //foo:bar ise projeniz bu hedefe @coworkers_project//foo:bar olarak atıfta bulunabilir. Harici proje adları geçerli çalışma alanı adları olmalıdır.
Bazel dışı projelere bağlılık
new_ ile başlayan kurallar (ör. new_local_repository), Bazel kullanmayan projelerden hedefler oluşturmanıza olanak tanır.
Örneğin, my-project/ projesi üzerinde çalıştığınızı ve iş arkadaşınızın coworkers-project/ projesine bağlı olmak istediğinizi varsayalım. İş arkadaşınızın projesi derleme için make kullanıyor ancak oluşturduğu .so dosyalarından birini kullanmak istiyorsunuz. Bunun için my_project/WORKSPACE öğesine aşağıdakileri ekleyin:
new_local_repository(
name = "coworkers_project",
path = "/path/to/coworkers-project",
build_file = "coworker.BUILD",
)
build_file, mevcut projeye yer paylaşımı olarak eklenecek bir BUILD dosyasını belirtir. Örneğin:
cc_library(
name = "some-lib",
srcs = glob(["**"]),
visibility = ["//visibility:public"],
)
Ardından, projenizin @coworkers_project//:some-lib dosyalarından BUILD öğesini kullanabilirsiniz.
Harici paketlere bağlı olma
Maven yapıları ve depoları
Maven depolarından yapıları indirmek ve bunları Java bağımlılıkları olarak kullanıma sunmak için rules_jvm_external kural kümesini kullanın.
Bağımlılıkları getirme
Varsayılan olarak, dış bağımlılıklar bazel build sırasında gerektiğinde getirilir. Belirli bir hedef grubu için gereken bağımlılıkları önceden getirmek istiyorsanız bazel fetch kullanın.
Tüm harici bağımlılıkları koşulsuz olarak getirmek için bazel sync kullanın.
Getirilen depolar çıkış tabanında depolandığından getirme işlemi çalışma alanı başına gerçekleşir.
Gölgeleme bağımlılıkları
Mümkün olduğunda projenizde tek bir sürüm politikası kullanmanız önerilir. Bu, derlediğiniz ve nihai ikili dosyanızda yer alan bağımlılıklar için gereklidir. Ancak bu durumun geçerli olmadığı durumlarda bağımlılıkları gölgelemek mümkündür. Aşağıdaki senaryoyu değerlendirin:
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, testrunner'ye bağlıdır ancak testrunner'nin farklı sürümlerine bağlıdırlar. Bu test çalıştırıcıların myproject içinde sorunsuz bir şekilde birlikte çalışmaması için bir neden yoktur ancak aynı ada sahip olduklarından birbirleriyle çakışırlar. Her iki bağımlılığı da bildirmek için myproject/WORKSPACE dosyasını güncelleyin:
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 mekanizma, elmasları birleştirmek için de kullanılabilir. Örneğin, A ve B aynı bağımlılığa sahipse ancak farklı adlarla çağrılıyorsa bu bağımlılıklar myproject/WORKSPACE'te birleştirilebilir.
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ından bazıları şunlardır:
- Sorunları ayıklama. Örneğin, değişiklikleri daha kolay yapabileceğiniz yerel bir dizine
http_archivedeposunu geçersiz kılabilirsiniz. - 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/HTTPS dosyalarını indirmek için kullanır (belirtilmişse).
IPv6 desteği
Yalnızca IPv6'nın kullanıldığı 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: IPv4 etkinse IPv4 tercih edilir. 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 sistem özelliğini kullanarak Bazel'in davranışını geçersiz kılabilir ve IPv6'yı tercih edebilirsiniz.
Özellikle:
--host_jvm_args=-Djava.net.preferIPv6Addresses=truebaşlangıç seçeneğini kullanın. Örneğin, aşağıdaki satırı.bazelrcdosyanıza ekleyin:startup --host_jvm_args=-Djava.net.preferIPv6Addresses=trueİnternete de bağlanması gereken Java derleme hedefleri çalıştırıyorsanız (bazen entegrasyon testleri için bu gerekir)
--jvmopt=-Djava.net.preferIPv6Addresses=truetool flag'i de kullanın. Örneğin,.bazelrcdosyanızda şu satırın bulunması gerekir:build --jvmopt=-Djava.net.preferIPv6AddressesBağımlılık sürümü çözümü için rules_jvm_external kullanıyorsanız
COURSIER_OPTSortam değişkenine-Djava.net.preferIPv6Addresses=trueekleyerek Coursier için JVM seçenekleri de sağlayın.
Geçişli bağımlılıklar
Bazel yalnızca WORKSPACE dosyanızda listelenen bağımlılıkları okur. Projeniz (A), WORKSPACE dosyasında üçüncü bir projeye (C) bağımlılığı listeleyen başka bir projeye (B) bağlıysa hem B hem de C projelerini projenizin WORKSPACE dosyasına eklemeniz gerekir. Bu koşul, WORKSPACE dosya boyutunu artırabilir ancak bir kitaplığın C sürüm 1.0'ı, diğerinin ise C sürüm 2.0'ı içerme olasılığını sınırlar.
Harici bağımlılıkların önbelleğe alınması
Varsayılan olarak Bazel, yalnızca tanımları değişirse harici bağımlılıkları yeniden indirir. Tanımda referans verilen dosyalarda (ör. yamalar veya BUILD dosyaları) yapılan değişiklikler de Bazel tarafından dikkate alınır.
Yeniden indirmeyi zorlamak için bazel sync kullanın.
Düzen
Tüm harici bağımlılıklar, output base içindeki external alt dizininin altındaki bir dizine indirilir. Yerel depo söz konusu olduğunda yeni bir dizin oluşturmak yerine sembolik bağlantı oluşturulur.
Aşağıdaki komutu çalıştırarak external dizinini görebilirsiniz:
ls $(bazel info output_base)/externalbazel clean komutunun çalıştırılmasının, harici dizini gerçekten silmeyeceğini unutmayın. Tüm harici yapıtları kaldırmak için bazel clean --expunge simgesini kullanın.
Çevrimdışı derlemeler
Bazen derlemeyi çevrimdışı olarak çalıştırmak istenebilir veya gerekli olabilir. Uçakla seyahat etme gibi basit kullanım alanlarında, bazel fetch veya bazel sync ile gerekli depoları prefetching yeterli olabilir. Ayrıca, --nofetch seçeneği kullanılarak derleme sırasında daha fazla deponun getirilmesi devre dışı bırakılabilir.
Gerekli dosyaların sağlanmasının bazel'den farklı bir tüzel kişi tarafından yapılması gereken gerçek çevrimdışı derlemeler için bazel, --distdir seçeneğini destekler. Bir depo kuralı, bazel'den ctx.download veya ctx.download_and_extract aracılığıyla bir dosya getirmesini istediğinde ve gerekli dosyanın karma toplamını sağladığında, bazel önce sağlanan ilk URL'nin temel adıyla eşleşen bir dosya için bu seçenekle belirtilen dizinlere bakar ve karma eşleşirse bu 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.
Ancak Bazel, ağa bağlanıp bağlanmadıklarını bilmeden, depo kurallarında rastgele komutların yürütülmesine izin verir. Bu nedenle, bazel'de derlemelerin tamamen çevrimdışı olmasını zorunlu kılma seçeneği yoktur. Bu nedenle, bir derlemenin çevrimdışı olarak doğru çalışıp çalışmadığını test etmek için ağın harici olarak engellenmesi gerekir. Bu, bazel'in bootstrap testinde yaptığı gibi bir işlemdir.
En iyi uygulamalar
Depo kuralları
Depo kuralı genellikle şunlardan sorumludur:
- Sistem ayarlarını algılama ve dosyalara yazma
- Sistemdeki diğer kaynakları bulma
- URL'lerden kaynak indirme
- BUILD dosyalarını oluşturma veya harici depo dizinine sembolik olarak bağlama.
Mümkün olduğunda repository_ctx.execute kullanmaktan kaçının. Örneğin, Make kullanılarak oluşturulmuş bir Bazel harici C++ kitaplığı kullanırken ctx.execute(["make"]) komutunu çalıştırmak yerine repository_ctx.download() komutunu kullanmak ve ardından kitaplığı oluşturan bir BUILD dosyası yazmak tercih edilir.
git_repository ve new_git_repository yerine http_archive tercih edilir. Bunun nedenleri şunlardır:
- Git deposu kuralları sistem
git(1)'ya bağlıyken HTTP indirici Bazel'e yerleştirilmiştir ve sistem bağımlılıkları yoktur. http_archive, yansıtma olarakurlslistesini destekler.git_repositoryise yalnızca tek birremote'ü destekler.http_archive, depo önbelleği ile çalışır ancakgit_repositoryile çalışmaz. Daha fazla bilgi için #5116 numaralı makaleyi inceleyin.
bind() kullanmayın. Sorunları ve alternatifleri hakkında ayrıntılı bilgi için "Bağlamayı kaldırmayı düşünün" bölümüne bakın.