Bu sayfada Bazel ile program derleme, derleme komutu söz dizimi ve hedef kalıbı söz dizimi.
Hızlı başlangıç kılavuzu
Bazel'ı çalıştırmak için temel workspace dizinine gidin.
veya alt dizinlerinden herhangi birine bağlı olarak ve bazel
türünde olduğundan emin olun. Aşağıdaki şartları karşılıyorsanız derleme bölümüne bakın:
ve yeni bir çalışma alanı oluşturmanız gerekiyor.
bazel help
[Bazel release bazel version]
Usage: bazel command options ...
Mevcut komutlar
analyze-profile
: Derleme profili verilerini analiz eder.aquery
: Analiz sonrası işlem grafiğinde bir sorgu yürütür.build
: Belirtilen hedefleri oluşturur.canonicalize-flags
: Bazel işaretlerini standartlaştırın.clean
: Çıkış dosyalarını kaldırır ve isteğe bağlı olarak sunucuyu durdurur.cquery
: Analiz sonrası bağımlılık grafiği sorgusu yürütür.dump
: Bazel sunucu işleminin dahili durumunu döküm haline getirir.help
: Komutlar veya dizin için yardımı yazdırır.info
: Bazel sunucusuyla ilgili çalışma zamanı bilgilerini gösterir.fetch
: Bir hedefin tüm harici bağımlılıklarını getirir.mobile-install
: Mobil cihazlara uygulamaları yükler.query
: Bağımlılık grafiği sorgusu yürütür.run
: Belirtilen hedefi çalıştırır.shutdown
: Bazel sunucusunu durdurur.test
: Belirtilen test hedeflerini oluşturur ve çalıştırır.version
: Bazel için sürüm bilgilerini yazdırır.
Yardım alma
bazel help command
: Şununla ilgili yardım ve seçenekleri yazdır:command
.bazel help
startup_options
: Bazel'i barındıran JVM için seçenekler.bazel help
target-syntax
: Hedefleri belirtmek için kullanılan söz dizimini açıklar.bazel help info-keys
: Bilgi komutu tarafından kullanılan anahtarların listesini görüntüler.
bazel
aracı, komut adı verilen birçok işlevi yerine getirir. En yaygın
bazel build
ve bazel test
kullanılıyor. Web sitenizdeki çalışmaları
bazel help
kullanılarak mesajlar.
Bir hedef oluşturma
Derleme işlemi başlatabilmek için çalışma alanına ihtiyacınız vardır. Çalışma alanı, oluşturmak için gereken tüm kaynak dosyaları içeren dizin ağacı bir uygulamadır. Bazel, tamamen salt okunur bir kaynaktan derleme yapmanıza olanak tanır. ses seviyesi.
Bazel ile program oluşturmak için bazel build
yazın ve ardından
oluşturmak istediğiniz hedeftir.
bazel build //foo
//foo
derleme komutunu verdikten sonra şuna benzer bir çıkış görürsünüz:
INFO: Analyzed target //foo:foo (14 packages loaded, 48 targets configured).
INFO: Found 1 target...
Target //foo:foo up-to-date:
bazel-bin/foo/foo
INFO: Elapsed time: 9.905s, Critical Path: 3.25s
INFO: Build completed successfully, 6 total actions
İlk olarak Bazel, hedefinizin bağımlılık grafiğindeki tüm paketleri yükler. Bu
bildirilen bağımlılıkları içerir. Dosyalar doğrudan hedefin BUILD
dosyasında listelenir
BUILD
dosyasında listelenen dosyaları ve geçişli bağımlılıkları
ve hedef bağımlılıklarını
ortaya koyabilir. Tüm bağımlılıkları belirledikten sonra Bazel, bunları analiz eder
bunları doğruluk açısından kontrol eder ve oluşturma işlemlerini oluşturur. Son olarak Bazel yürütme işlemini
derleyiciler ve derlemenin diğer araçları.
Derlemenin yürütme aşamasında Bazel, ilerleme mesajlarını yazdırır. İlerleme durumu iletilerinin yer aldığı geçerli derleme adımını (örneğin, derleyici veya bağlayıcı) toplam derleme işlemi sayısına göre tamamlanır. başlarsa Bazel yeni bir keşif oluşturdıkça toplam işlemlerin sayısı da işlem grafiğinin tamamını görüntüleyebilir, ancak bu sayı birkaç saniye içinde sabitlenir.
Derlemenin sonunda, Bazel hangi hedeflerin istendiğini
başarılı bir şekilde oluşturulmadığını ve Öyleyse, çıktı dosyalarının
bulundu. Derleme çalıştıran komut dosyaları bu çıkışı güvenilir bir şekilde ayrıştırabilir. bkz.
Ayrıntılı bilgi için --show_result
.
Aynı komutu tekrar yazarsanız derleme çok daha hızlı tamamlanır.
bazel build //foo
INFO: Analyzed target //foo:foo (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //foo:foo up-to-date:
bazel-bin/foo/foo
INFO: Elapsed time: 0.144s, Critical Path: 0.00s
INFO: Build completed successfully, 1 total action
Bu, boş bir derlemedir. Herhangi bir değişiklik olmadığı için yeniden yüklenecek paket yok hiçbir derleme adımı yok. 'foo' bölümünde bir değişiklik olduysa veya Bazel bazı derleme işlemlerini yeniden yürütür veya bir artımlı derlemedir.
Birden çok hedef oluşturma
Bazel, oluşturulacak hedeflerin belirlenmesi için çeşitli yöntemler sunar. Bu durumda
Bunlar hedef kalıplar olarak bilinir. Bu söz dizimi,
build
, test
veya query
.
Etiketler, kullanıcı tercihlerini
Örneğin BUILD
dosyalarında bağımlılıkları tanımlamak için kullanılan bazı hedefler,
birden fazla hedef belirtir. Hedef kalıpları,
Hedef grupları için joker karakterler kullanarak etiket söz dizimi. En basit senaryoda
geçerli bir etiket aynı zamanda, tam olarak bir taneden oluşan bir kümeyi tanımlayan geçerli bir hedef kalıbıdır.
hedefi belirleyebilirsiniz.
//
ile başlayan tüm hedef kalıpları mevcut duruma göre çözümlenir
çalışmayacaktır.
//foo/bar:wiz |
Yalnızca tek bir hedef //foo/bar:wiz . |
//foo/bar |
//foo/bar:bar etiketine eş değer. |
//foo/bar:all |
foo/bar paketindeki tüm kural hedefleri. |
//foo/... |
foo dizininin altındaki tüm paketlerde bulunan tüm kural hedefleri. |
//foo/...:all |
foo dizininin altındaki tüm paketlerde bulunan tüm kural hedefleri. |
//foo/...:* |
foo dizininin altındaki tüm paketlerdeki tüm hedefler (kurallar ve dosyalar). |
//foo/...:all-targets |
foo dizininin altındaki tüm paketlerdeki tüm hedefler (kurallar ve dosyalar). |
//... |
Ana depodaki paketlerdeki tüm kural hedefleridir. Hedef içermez harici depolar. |
//:all |
kök dizin. |
//
ile başlamayan hedef kalıpları,
güncel çalışma dizini oluşturun. Bu örneklerde foo
işletim sisteminin bir çalışma dizini olduğu varsayılmıştır:
:foo |
//foo:foo etiketine eş değer. |
bar:wiz |
//foo/bar:wiz etiketine eş değer. |
bar/wiz |
Eşdeğer:
|
bar:all |
//foo/bar:all etiketine eş değer. |
:all |
//foo:all etiketine eş değer. |
...:all |
//foo/...:all etiketine eş değer. |
... |
//foo/...:all etiketine eş değer. |
bar/...:all |
//foo/bar/...:all etiketine eş değer. |
Varsayılan olarak, dizin sembolik bağlantıları yinelemeli hedef kalıpları için izlenir, Bunlar, çıktı tabanının altında olanlar hariç, çalışma alanının kök dizininde oluşturulan sembolik bağlantılar.
Ayrıca Bazel, yinelemeli hedefi değerlendirirken sembolik bağlantıları izlemez
kalıpları aşağıdaki gibi adlandırılmış bir dosyayı içeren herhangi bir dizinde bulunabilir:
DONT_FOLLOW_SYMLINKS_WHEN_TRAVERSING_THIS_DIRECTORY_VIA_A_RECURSIVE_TARGET_PATTERN
.
foo/...
, paketler üzerinde uygulanan ve tüm paketleri yinelemeli olarak gösteren bir joker karakterdir
foo
dizininin altında (paket yolunun tüm kökleri için). :all
bir
bir paketteki tüm kurallarla eşleşen, hedefler üzerinde joker karakter. Bu ikisi
birlikte (foo/...:all
olduğu gibi) ve her iki joker karakter de kullanıldığında, bu
foo/...
olarak kısaltılır.
Ayrıca :*
(veya :all-targets
) her hedefle eşleşen bir joker karakterdir
normalde herhangi bir kurala göre oluşturulmayan dosyalar da dahil olmak üzere eşleşen paketler
Örneğin, java_binary
kurallarıyla ilişkili _deploy.jar
dosyaları.
Bu, :*
değerinin :all
öğesinin bir üst kümesini belirttiği anlamına gelir; potansiyel olarak
kafa karıştırıcıdır; bu söz dizimi, :all
joker karakterinin
_deploy.jar
gibi hedeflerin oluşturulmasının istenmediği tipik derlemeler.
Ayrıca,
Etiket söz dizimi; bu genellikle Bash dosya adı genişletmesi kullanılırken kullanışlıdır.
Örneğin foo/bar/wiz
, //foo/bar:wiz
ile eşdeğerdir (geçerli bir değer varsa
paketi foo/bar
) veya //foo:bar/wiz
(foo
paketi varsa).
Birçok Bazel komutu, bağımsız değişken olarak bir hedef kalıpları listesini kabul eder ve
önek olumsuzlama operatörünü -
dikkate alın. Bu, toplamda
önceki bağımsız değişkenlerde belirtilen kümeden hedefler. Bunun, dönüşüm hunisinin
sıra önemlidir. Örneğin,
bazel build foo/... bar/...
"foo
altındaki tüm hedefleri ve bar
altındaki tüm hedefleri oluştur" anlamına gelir.
bazel build -- foo/... -foo/bar/...
"foo/bar
altındakiler hariç foo
altındaki tüm hedefleri oluştur" anlamına gelir. (
-
ile başlayan sonraki bağımsız değişkenlerin önüne geçmek için --
bağımsız değişkeni gereklidir
ek seçenekler olarak yorumlanmasını engelleyebilir.)
Ancak, hedefleri bu şekilde çıkarmanın,
hedeflerin bağımlılıkları olabileceğinden bunların oluşturulmadığını garanti eder.
elde edebilirsiniz. Örneğin, //foo:all-apis
hedefi olsaydı
//foo/bar:api
metriğine bağlı olduğunu fark ederseniz, ikincisi
bir bölüm oluşturabilirsiniz.
tags = ["manual"]
içeren hedefler, joker karakter hedef kalıplarına dahil edilmez
(...
, :*
, :all
vb.).
bazel build
ve bazel test
(ancak şuna dahildir:
negatif joker karakter hedef kalıpları kullanılır; yani bunlar çıkarılır). Şunları yapmalısınız:
bu tür test hedeflerini komut satırında açık hedef kalıplarıyla belirtmenizi
bunları Bazel'ın oluşturmasını/test etmesini istersiniz. Buna karşın, bazel query
hiç performans göstermiyor
(bu, filtrenin amacına uygun olmayan)
bazel query
) bilgileri gösterilir.
Harici bağımlılıkları getirme
Varsayılan olarak, yükleme sırasında Bazel
seçeceğiz. Ancak bu istenmeyen bir durum olabilir çünkü
yeni dış bağımlılıklar eklendiğinde veya
bağımlılıkları ya da mevcut
"önceden getirme" bağımlılıkları (örneğin, çevrimdışı olacağınız uçuştan önce). Şu durumda:
yeni bağımlılıklar eklenmesini önlemek istiyorsanız
--fetch=false
işaretini belirtebilir. Yalnızca bu işaretin
yerel dizindeki bir dizine işaret etmeyen depo kuralları için geçerlidir.
dosya sistemidir. Örneğin, local_repository
ile ilgili değişiklikler,
new_local_repository
ile Android SDK ile NDK deposu kuralları
--fetch
değerinden bağımsız olarak her zaman geçerli olur .
Derleme sırasında getirme işlemine izin vermezseniz ve Bazel yeni harici yoksa derlemeniz başarısız olur.
bazel fetch
komutunu çalıştırarak bağımlılıkları manuel olarak alabilirsiniz. Eğer
oluşturma sırasında izin vermezseniz bazel fetch
komutunu çalıştırmanız gerekir:
- İlk kez yapı oluşturmadan önce.
- Yeni bir harici bağımlılık ekledikten sonra.
Çalıştırıldıktan sonra WORKSPACE'e kadar tekrar çalıştırmanız gerekmez dosya değişiklikleri dosyası.
fetch
, bağımlılıkları getirmek için hedeflerin listesini alır. Örneğin,
Örneğin, bu komut //foo:bar
oluşturmak için gerekli olan bağımlılıkları getirir
ve //bar:baz
:
bazel fetch //foo:bar //bar:baz
Bir çalışma alanının tüm harici bağımlılıklarını getirmek için şu komutu çalıştırın:
bazel fetch //...
Bazel 7 veya sonraki sürümlerde, Bzlmod'u etkinleştirdiyseniz dış bağımlılıkları ortaya çıkarıp
bazel fetch
Kullandığınız tüm araçlara sahipseniz "bazel getirme"yi hiç çalıştırmanız gerekmez
kullanarak (kitaplık jar'larından JDK'nin kendisine kadar) bulun.
Ancak, Workspace dizini dışında bir uygulama kullanıyorsanız Bazel
çalıştırmadan önce otomatik olarak bazel fetch
çalıştırır
bazel build
.
Depo önbelleği
Bazel, aynı dosya aynı olsa bile birkaç kez aynı dosyayı getirmekten
farklı çalışma alanlarında kullanılması gerekiyorsa veya harici
depoyu değiştirdik, ancak indirilebilmesi için hâlâ aynı dosyanın olması gerekiyor. Bunun için,
bazel, depo önbelleğine indirilen tüm dosyaları önbelleğe alır. Bu önbellek,
~/.cache/bazel/_bazel_$USER/cache/repos/v1/
adresinde bulunuyor. İlgili içeriği oluşturmak için kullanılan
konumu, --repository_cache
seçeneği ile değiştirilebilir. İlgili içeriği oluşturmak için kullanılan
önbellek, tüm çalışma alanları ve bazel'in yüklü sürümleri arasında paylaşılır.
Aşağıdaki durumlarda önbellekten bir giriş alınır:
Bazel, doğru dosyanın bir kopyasının bulunduğundan emin olabilir. Başka bir deyişle,
indirme isteği, belirtilen dosyanın SHA256 toplamına ve
olup olmadığını kontrol edin. Her harici dosya için bir karma belirtmek
iyi bir fikir değil; güvenlik açısından iyi bir fikir. ekip üyelerinden
anlamına gelir.
Her önbellek isabetinde, dosyanın önbellekteki değiştirilme zamanı güncellendi. Bu şekilde, bir dosyanın önbellek dizinindeki son kullanımında belirleyebilirsiniz. Önbellek, hiçbir zaman üzerinde çalışmayan bir dosyanın kopyasını içerebileceği için, kullanılabilir hale getirebilirsiniz.
[Kullanımdan kaldırıldı] Dağıtım dosyası dizinleri
Kullanımdan kaldırıldı: Çevrimdışı derleme gerçekleştirmek için depo önbelleğinin kullanılması tercih edilir.
Dağıtım dizini, gereksiz kullanımı önlemek için kullanılan başka bir Bazel mekanizmasıdır indirin. Bazel, depo önbelleğinden önce dağıtım dizinlerinde arama yapar. En önemli fark, dağıtım dizininin manuel olarak hazırlık.
Her bir
--distdir=/path/to-directory
seçeneğiyle dosya aramak için ek salt okunur dizinler belirtebilirsiniz
otomatik olarak eklenir. Dosya adı
URL'nin temel adına eşittir ve buna ek olarak dosyanın karma değeri de
değerine eşit olmalıdır. Bu yalnızca
dosya karması WORKSPACE bildiriminde belirtilir.
Dosya adındaki koşul doğruluk için gerekli olmasa da aday dosyaların sayısını belirtilen dizin başına bir olacak şekilde azaltır. Burada şekilde dağıtım dosyası dizinlerini belirtmek etkili olmaya devam etse de o dizindeki dosyaların sayısı artar.
Bazel'i hava boşluklu bir ortamda çalıştırma
Bazel'in ikili program boyutunu küçük tutmak için Bazel'in örtülü bağımlılıkları getirilir. çalıştırmanız gerekir. Bu örtülü bağımlılıklar herkes için gerekli olmayabilecek araç zincirleri ve kurallar içermelidir. Örneğin, Örneğin, Android araçları gruptan çıkarıldı ve yalnızca Android kurulumu sırasında getirilir. bilgi edinmenizi sağlar.
Ancak bu örtülü bağımlılıklar, tüm harici tedarikçileri veya üçüncü taraf hizmetlerini (300) dolar ve bildirmeyi konuştuk. Bu sorunu çözmek için depo önbelleği hazırlayabilirsiniz (Bazel 7 veya içeren) veya dağıtım dizini (7'den önceki Bazel ile) olan bir makinede dışa aktarmak ve daha sonra bunları çevrimdışı bir yaklaşımla geliştirebilirsiniz.
Depo önbelleği (Bazel 7 veya sonrası ile)
Depo önbelleğini hazırlamak için
--repository_cache
tıklayın. Bu işlemi her yeni Bazel ikili sürümü için bir kez yapmanız gerekir, çünkü bu işlem
her sürümde örtülü bağımlılıklar
farklı olabilir.
Bu bağımlılıkları Airgapped ortamınızın dışına getirmek için önce bir çalışma alanı seçin:
mkdir empty_workspace && cd empty_workspace
touch MODULE.bazel
touch WORKSPACE
Yerleşik Bzlmod bağımlılıklarını getirmek için
bazel fetch --repository_cache="path/to/repository/cache"
Hâlâ eski WORKSPACE dosyasını kullanıyorsanız yerleşik WORKSPACE dosyasını getirmek ve bağımlılıklarını
bazel sync --repository_cache="path/to/repository/cache"
Son olarak, Airgapped ortamınızda Bazel'ı kullanırken aynı
--repository_cache
işareti. Kolaylık olması için .bazelrc
olarak ekleyebilirsiniz.
giriş:
common --repository_cache="path/to/repository/cache"
Ek olarak,
Yerel olarak BCR
--registry
işaretini kullanarak, Bazel'in
BCR (İnternet üzerinden BCR) gerektirir. Aşağıdaki satırı .bazelrc
sayfanıza ekleyin:
common --registry="path/to/local/bcr/registry"
Dağıtım dizini (7'den önceki Bazel ile)
Dağıtım dizinini hazırlamak için
--distdir
tıklayın. Bu işlemi her yeni Bazel ikili sürümü için bir kez yapmanız gerekir, çünkü bu işlem
her sürümde örtülü bağımlılıklar
farklı olabilir.
Bu bağımlılıkları havalandırmalı ortamınızın dışında oluşturmak için öncelikle Bazel kaynak ağacını doğru sürümden kontrol edin:
git clone https://github.com/bazelbuild/bazel "$BAZEL_DIR"
cd "$BAZEL_DIR"
git checkout "$BAZEL_VERSION"
Ardından, bu hedef için dolaylı çalışma zamanı bağımlılıklarını içeren belirli Bazel sürümü:
bazel build @additional_distfiles//:archives.tar
Bu tarball'u, Airgapped'inize kopyalanabilecek bir dizine aktarın
bahsedeceğim. --distdir
değeri olabileceğinden --strip-components
işaretine dikkat edin.
son derece hassas:
tar xvf bazel-bin/external/additional_distfiles/archives.tar \
-C "$NEW_DIRECTORY" --strip-components=3
Son olarak, Airgapped ortamınızda Bazel'ı kullandığınızda --distdir
işaretini kaldırın. Kolaylık olması için .bazelrc
olarak ekleyebilirsiniz.
giriş:
build --distdir=path/to/directory
Yapılandırmaları ve çapraz derleme derleme
Belirli bir derlemenin davranışını ve sonucunu belirten tüm girişler
üç kategoriye ayrılır. İlk tür,
projenizin BUILD
dosyalarında depolanan bilgiler: derleme kuralı,
özelliklerinin değerlerini ve geçişli bağımlılıklarının tamamını içerir.
İkinci veri türü ise kullanıcı veya kuruluş tarafından sağlanan harici ya da çevresel verilerdir.
tarafından yapılan değişiklikler: hedef mimari, derleme ve bağlantı seçimi
yapılandırma seçeneklerini ve diğer araç zinciri yapılandırma seçeneklerini gösterir. Tam bir set
yapılandırma olarak çevresel verilerin bir listesini sunar.
Herhangi bir derlemede birden fazla yapılandırma olabilir. Bir
64 bit için yürütülebilir bir //foo:bin
derlediğiniz çapraz derleme
ancak iş istasyonunuz 32 bit makineyse. Açıkçası, derleme
64 bit oluşturabilen bir araç zinciri kullanarak //foo:bin
derlemesi gerektirir
ancak derleme sisteminin, çalıştırma sırasında kullanılan çeşitli araçları
(örneğin, kaynağından oluşturulan araçlar) ve daha sonra
bir genel kuraldır ve bunların sizin iş istasyonunuzda çalışacak şekilde oluşturulması gerekir. Dolayısıyla,
iki yapılandırma tanımlayabiliriz: exec configuration (yürütme yapılandırması)
derleme sırasında çalışan araçlar oluşturmak ve hedef yapılandırma için
(veya istek yapılandırma seçeneği kullanılır, ancak "hedef yapılandırma" daha sık
ancak bu kelimenin zaten birçok anlamı vardır). Bu da
en son talep ettiğiniz ikili programdır.
Genellikle, istenen her iki dosyanın ön koşulu olan birçok kitaplık vardır.
derleme hedefi (//foo:bin
) ve bir veya daha fazla yönetici aracından
temel kitaplıklar. Bu tür kitaplıklar, bir kez yönetici için olmak üzere iki kez oluşturulmalıdır.
bir kez de hedef yapılandırma için. Bazel,
iki varyantın da oluşturulduğundan ve türetilen dosyaların saklandığından emin olunması
müdahaleyi önlemek için ayrı olmalıdır; Genellikle bu tür hedefler eşzamanlı olarak oluşturulabilir.
birbirlerinden bağımsızdır. İlerleme durumu mesajları görürseniz
bir hedefin iki kez oluşturulduğunu gösterir. Bu, büyük olasılıkla
açıklama.
Yürütme yapılandırması, hedef yapılandırmadan şu şekilde türetilir:
- Crosstool (
--crosstool_top
) aracının istek yapılandırması (--host_crosstool_top
belirtilmediği sürece) --cpu
için--host_cpu
değerini kullanın (varsayılan:k8
).- Bu seçeneklerin, istekte belirtilenle aynı değerlerini kullan
yapılandırma:
--compiler
,--use_ijars
ve--host_crosstool_top
ise kullanılırsa--host_cpu
değeri, Yönetici için Crosstool'dadefault_toolchain
(--compiler
yok sayılıyor) yapılandırma. --javabase
için--host_javabase
değerini kullanın--java_toolchain
için--host_java_toolchain
değerini kullanın- C++ kodu (
-c opt
) için optimize edilmiş derlemeler kullanın. - Hata ayıklama bilgisi oluşturmayın (
--copt=-g0
). - Yürütülebilir dosyalardan ve paylaşılan kitaplıklardan hata ayıklama bilgilerini kaldırın
(
--strip=always
). - Türetilen tüm dosyaları, Google tarafından kullanılandan farklı özel bir konuma yerleştirin istek yapılandırmasını devreye sokmanız gerekir.
- Derleme verileriyle ikili programların damgalanmasını engelle (
--embed_*
seçeneklerine bakın). - Diğer tüm değerler varsayılan ayarlarında kalır.
Farklı bir yönetici seçmenin tercih edilmesinin birçok nedeni vardır istek yapılandırmasındaki isteğe bağlı bir yapılandırmadır. En önemlisi:
İlk olarak, sadeleştirilmiş ve optimize edilmiş ikili programlar kullanarak sitenizin araçları, araçların doldurduğu disk alanını ve ağ G/Ç süresini artırır.
İkinci olarak, tüm derlemelerde yöneticiyi ayrıştırarak ve istek yapılandırmaları e-posta metinlerinde ufak değişikliklerden kaynaklanabilecek çok pahalı yeniden açıklandığı gibi (örneğin, bağlayıcı seçeneklerinin değiştirilmesi) anlatacağım.
Artımlı yeniden oluşturma işlemlerini düzeltin
Bazel projesinin birincil hedeflerinden biri, proje maliyetlerinin yeniden inşa edilir. Önceki derleme araçları, özellikle de Marka tabanlı olanlar artımlı yapılarla ilgili yanlış varsayımlar ortaya çıkarır.
İlk olarak, dosyaların zaman damgaları tekdüze olarak artar. Bu her zaman olduğu gibi, bu varsayıma aldatmak çok kolaydır. şununla senkronize ediliyor: dosyanın daha eski bir sürümü, dosyanın değiştirme süresinin kısalmasına neden olur; Marka tabanlı sistemler yeniden oluşturulmaz.
Daha genel olarak ifade etmek gerekirse, Yapma, dosyalarda yapılan değişiklikleri algılasa da değişiklikleri algılamaz.
komutlara dönüştürebilirsiniz. Belirli bir derlemede derleyiciye iletilen seçenekleri değiştirirseniz
adımında, Make derleyiciyi yeniden çalıştırmaz ve silmek için manuel olarak
önceki derlemenin geçersiz çıkışlarını make clean
kullanarak düzeltin.
Ayrıca Make, bir e-postanın başarısız şekilde sonlandırılmasına karşı dayanıklı değildir. bu alt işlemin çıkış dosyasına yazmaya başlamasından sonraki alt işlemleri içerir. Bu sırada Yapma'nın mevcut yürütülmesi başarısız olursa bir sonraki Make körü körüne kesilmiş çıkış dosyasının geçerli olduğunu varsayın (çünkü yer alır) ve yeniden oluşturulmaz. Benzer şekilde, Yapma işlemi benzer bir durum ortaya çıkabilir.
Bazel, bu ve benzeri varsayımlardan kaçınır. Bazel tüm anahtar kelimeleri içeren bir veritabanını bir yapı adımını atlar. Yapı adımı, yalnızca o derleme adımına ait giriş dosyalarını (ve zaman damgalarını) ve derlemeyi komutunun olması, veritabanındakilerden biriyle tam olarak eşleşmesi ve veritabanı girişiyle tam olarak eşleşen çıkış dosyaları kümesi (ve bunların zaman damgaları) zaman damgalarını kapsayabilir. Giriş dosyalarında veya çıkışta yapılan herhangi bir değişiklik derleme adımının yeniden yürütülmesine neden olur.
Doğru artımlı derlemelerin kullanıcılarına faydası şu şekildedir:
zihin bulanıklığı. (Ayrıca, gerekli veya önleme amaçlı olsun, make
clean
kullanımından kaynaklanan yeniden oluşturma işlemleri için daha az süre harcanır.)
Tutarlılık ve artımlı derlemeler oluşturma
Resmî bir şekilde, beklenen tüm koşullar karşılandığında bir derlemenin durumunu tutarlı olarak tanımlarız: adımlarda veya belirtilen şekilde, çıkış dosyalarının mevcut olduğundan ve içeriklerinin doğru olduğundan emin olun. kuralları belirlemeniz gerekir. Bir kaynak dosyayı düzenlediğinizde, derlemenin tutarsız olduğu söylenir ve bir sonraki çalıştırmanıza kadar tutarsız kalır yardımcı olacak pek çok yararlı uygulama vardır. Bu durumu kararsız tutarsızlık, çünkü yalnızca geçicidir ve tutarlılık çalıştırmayı göstereceğim.
Zararlı olan başka bir tutarsızlık daha vardır: kararlılık
Tutarsızlık. Derleme kararlı ve tutarsız bir duruma ulaşırsa tekrarlanır
çağrısının başarılı bir şekilde yapılması tutarlılığı geri kazanmaz:
ve çıkışlar yanlış kalır. Kararlı ve tutarsız durumlar
Marka (ve diğer derleme araçları) kullanıcılarının make clean
türünün ana nedeni budur.
Derleme aracının bu şekilde başarısız olduğunu tespit etme (ve sonra kurtarma işlemini
çok zaman alıcı ve sinir bozucu olabilir.
Kavramsal olarak tutarlı bir yapıya sahip olmanın en basit yolu tüm derleme çıkışlarını gözden geçirin ve baştan başlayın: her derlemeyi temiz bir derleme yapın. Bu yaklaşımın pratik olamayacak kadar fazla zaman aldığı açıktır ( kullanıma sunma mühendisleri içindir) ve dolayısıyla kullanışlı olması için derleme aracının Böylece tutarlılıktan ödün vermeden artımlı derlemeler yapabilirsiniz.
Doğru bir artımlı bağımlılık analizi yapmak zordur ve yukarıda açıklandığı gibi diğer derleme araçları, test sırasında iyi bir fırsattır. Buna karşın Bazel'in sunduğu garantiyi aşağıda bulabilirsiniz: hiç düzenleme yapmamış olduğunuz başarılı bir şekilde çağrıldığında tutarlı bir durumda olacaktır. (Kaynak dosyalarınızı yoksa Bazel, oluşturulan bu derlemenin sonucunun tutarlılığı mevcut derlemedir. Ancak sonraki derlemenin sonuçlarının, tutarlılığı sağlar.)
Tüm garantilerde olduğu gibi, bazı ek bilgiler vardır: Bunları bilinen kararlı bir şekilde çalışmaya başladı. Size bu konuda garanti vermeyiz: bilinçli bir şekilde hata bulma girişimlerinden kaynaklanan bu tür sorunları ancak artımlı bağımlılık analizi yapıp sorunu çözmek için normal veya "makul" durumundan kaynaklanan tüm istikrarsız ve tutarsız durumların hepsi kullanımı aracı geliştirir.
Bazel'de sabit bir tutarsız durum tespit ederseniz lütfen hata bildirin.
Korumalı alanlı yürütme
Bazel, işlemlerin hermetik olarak gerçekleşmesini sağlamak için korumalı alanları kullanır.
sağlayabilir. Bazel, korumalı alanlarda spawn (daha genel ifadelerle: eylemler) çalıştırır.
Aracın işini yapması için gereken minimum dosya grubunu içermelidir. Şu anda
korumalı alan oluşturma özelliği, CONFIG_USER_NS
seçeneğiyle birlikte Linux 3.12 veya daha yeni sürümlerde çalışır
etkin ve macOS 10.11 veya sonraki sürümlerde kullanılabilir.
Sisteminiz korumalı alan kullanımını desteklemiyorsa Bazel bir uyarı yazdırarak
yapıların hermetik olacağı garanti edilmez ve bu tür yapıların
bilinmeyen yöntemlerle değiştirebilirsiniz. Bu uyarıyı devre dışı bırakmak için
Bazel'e --ignore_unsupported_sandboxing
işareti.
Google Kubernetes gibi bazı platformlarda
Engine küme düğümleri veya Debian,
kullanıcı ad alanları, güvenlik nedeniyle varsayılan olarak devre dışı bırakılır
emin olun. Bunu, dosyaya bakıp kontrol ederek
/proc/sys/kernel/unprivileged_userns_clone
: Varsa ve 0 içeriyorsa,
Kullanıcı ad alanları,
sudo sysctl kernel.unprivileged_userns_clone=1
.
Bazı durumlarda Bazel korumalı alanı, sistem nedeniyle
kurulumu. Belirti genellikle şuna benzer bir mesaj üreten bir hatadır:
namespace-sandbox.c:633: execvp(argv[0], argv): No such file or directory
Bu durumda, şu soruna sahip kullanıcılar için korumalı alanı devre dışı bırakmayı deneyin:
--strategy=Genrule=standalone
ve diğer kurallar için
--spawn_strategy=standalone
. Ayrıca lütfen hata bildiriminde bulunun.
ve hangi Linux dağıtımını kullandığınızdan bahsederek
sorunu araştırıp sonraki bir sürümde düzeltmeyi sağlayabilirsiniz.
Yapının aşamaları
Bazel'de bir yapı üç farklı aşamada gerçekleşir: kullanıcı olarak arasındaki fark, derlemeyi kontrol eden seçenekler hakkında (aşağıya bakın).
Yükleme aşaması
İlki yükleme işlemidir. Bu işlem sırasında ilk hedeflerin ve bağımlılıkların geçişli olarak kapatılmasının yüklenmesi, ayrıştırılır, değerlendirilir ve önbelleğe alınır.
Bazel sunucusu başlatıldıktan sonraki ilk derleme için yükleme aşaması BUILD dosyası yüklenmesi birkaç saniye sürer. İçinde sonraki derlemeler için de geçerlidir, özellikle de hiçbir BUILD dosyası değişmediyse çok hızlı şekilde halleder.
Bu aşamada bildirilen hatalar şunları içerir: paket bulunamadı, hedef bulunamadı, BUILD dosyasındaki sözlük ve dil bilgisi hataları ile değerlendirme hataları.
Analiz aşaması
İkinci aşama olan analiz ise verilerin, anlamsal analizi ve doğrulanmasını içerir. her derleme kuralının, bir derleme bağımlılık grafiğinin tam olarak hangi işin yapılacağının belirlenmesini sağlar.
Yükleme gibi, analiz de tamamen hesaplandığında birkaç saniye sürer. Ancak Bazel, bağımlılık grafiğini bir derlemeden diğerine ve yalnızca olması gerekeni yeniden analiz eder ve böylece artımlı Bu durum, paketlerin önceki derlemeden bu yana değişmediği durumlarda geçerlidir.
Bu aşamada bildirilen hatalar şunları içerir: uygunsuz bağımlılıklar, geçersiz ve kurala özel tüm hata mesajlarını içeren bir e-posta alırsınız.
Bazel gereksiz dosyalardan kaçındığı için yükleme ve analiz aşamaları hızlıdır Bu aşamada G/Ç'de çalışır ve yürütülecek çalışmayı belirlemek için yalnızca BUILD dosyalarını okur. tamamlandı. Bu tasarım gereğidir ve Bazel'i analiz araçları, Örneğin, Bazel'in query komutunu çalıştırarak aşamasındayız.
Yürütme aşamasında
Derlemenin üçüncü ve son aşaması yürütme adımıdır. Bu aşama, proje yöneticisinin derlemedeki her adımın çıktıları girişlerle tutarlıdır. Yeniden çalıştırılarak derleme/bağlantı oluşturma vb. olabilir. Bu adımda, derleme genelde birkaç saniye ile büyük bir yayın için bir saatten seçeceğiz. Bu aşamada bildirilen hatalar şunlardır: eksik kaynak dosyalar, hatalar derleme işlemi tarafından yürütülen bir araçta ya da aracın ve beklenen çıkışları belirlemeniz gerekir.