Bazel ile program oluşturun

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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 helpstartup_options: Bazel'i barındıran JVM için seçenekler.
  • bazel helptarget-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:
  • foo/bar/wiz bir paketse //foo/bar/wiz:wiz
  • foo/bar bir paketse //foo/bar:wiz
  • Aksi durumda //foo:bar/wiz
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 MODULE.bazel komutuna 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ı, depo kuralı 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'i geliştirirken 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

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. oluşturma hedefi (//foo:bin) ve bir veya daha fazla yönetici aracı, örneğin 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'da default_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ürütmeyi ayrıştırarak ve istek yapılandırmaları ile 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 istikrarlı tutarsız durumlar, 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 basit bir ifadeyle 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ı

Birincisi 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 saati 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.