Sorularınız veya desteğe ihtiyacınız varsa Yardım Alma başlıklı makaleye göz atın.
Bazel nedir?
Bazel, yazılım derleme ve testlerini otomatikleştiren bir araçtır. Desteklenen derleme görevleri arasında, yürütülebilir programlar ve kitaplıklar oluşturmak için derleyici ve bağlayıcı çalıştırmanın yanı sıra Android, iOS ve diğer hedef ortamlar için dağıtılabilir paketler derleme yer alır. Bazel; Make, Karınca, Gradle, Buck, Pantolon ve Maven gibi diğer araçlara benzer.
Bazel'i özel kılan ne?
Bazel, Google'da yazılımın geliştirilme biçimine uyacak şekilde tasarlanmıştır. Aşağıdaki özelliklere sahiptir:
- Çoklu dil desteği: Bazel, birçok dili destekler ve rastgele programlama dillerini destekleyecek şekilde genişletilebilir.
- Üst düzey derleme dili: Projeler, bir projeyi birbirine bağlı küçük kitaplıklar, ikili programlar ve test grupları olarak tanımlayan kısa ve öz metin biçimi olan
BUILD
dilinde açıklanır. Bunun aksine, Yapma gibi araçlarda, dosyaları ve derleyici çağrılarını tek tek açıklamanız gerekir. - Çoklu platform desteği: Farklı mimariler, hatta farklı platformlar için yazılım oluşturmak amacıyla aynı araç ve aynı
BUILD
dosyaları kullanılabilir. Google'da, veri merkezlerimizdeki sistemlerde çalışan sunucu uygulamalarından cep telefonlarında çalışan istemci uygulamalarına kadar her şeyi derlemek için Bazel'ı kullanıyoruz. - Yeniden oluşturulabilirlik:
BUILD
dosyalarında her kitaplık, test ve ikili program, doğrudan bağımlılıklarını eksiksiz olarak belirtmelidir. Bazel, kaynak dosyada değişiklik yaptığınızda nelerin yeniden oluşturulması gerektiğini ve buna paralel olarak yürütülebilecek görevleri öğrenmek için bu bağımlılık bilgilerini kullanır. Bu, tüm derlemelerin artımlı olduğu ve her zaman aynı sonucu vereceği anlamına gelir. - Ölçeklenebilir: Bazel büyük derlemeleri işleyebilir. bir sunucu ikili programının 100 bin kaynak dosyasına sahip olması yaygın bir durumdur ve hiçbir dosyanın değiştirilmediği derlemeler yaklaşık 200 ms. sürer.
Google neden...?
- Yap, Ninja: Bu araçlar, dosya oluşturmak için hangi komutların çağrılacağını tam olarak kontrol edebiliyor, ancak doğru kural yazabilmek kullanıcının sorumluluğunda.
- Kullanıcılar Bazel ile daha üst düzeyde etkileşimde bulunur. Örneğin, Bazel'in "Java testi", "C++ ikili programı" ve "hedef platform" ile "ana makine platformu" gibi yerleşik kuralları vardır. Bu kurallar, kuvvetlice test edilmiş olup hiçbir güvenlik unsuru taşımaz.
- Karınca ve Maven: Karınca ve Maven ağırlıklı olarak Java'ya yöneliktir, Bazel ise birden çok dili işliyor. Bazel, kod tabanlarını yeniden kullanılabilir daha küçük birimler halinde alt bölümlere ayırmayı teşvik eder ve yalnızca yeniden oluşturulması gerekenleri yeniden oluşturabilir. Böylece, daha büyük kod tabanlarıyla çalışırken geliştirme işlemi hızlanır.
- Gradle: Bazel yapılandırma dosyaları Gradle'ınkinden çok daha yapılandırılmıştır, Bazel her işlemin tam olarak ne yaptığını anlamalarını sağlar. Bu, daha fazla paralellik ve daha iyi üretim olanağı sağlar.
- Pantolonlar, Buck: Her iki araç da sırasıyla Twitter, Foursquare ve Facebook'taki eski Google çalışanları tarafından oluşturuldu ve geliştirildi. Bunlar Bazel'e göre modellenmiş olsa da özellik kümeleri farklı olduğundan bizim için uygun alternatifler değildir.
Bazel nereden geldi?
Bazel, Google'ın sunucu yazılımını dahili olarak oluşturmak için kullandığı bir araçtır. Sunucularımıza bağlanan mobil uygulamalar (iOS, Android) gibi diğer yazılımları da oluşturacak şekilde genişledi.
Dahili aracınızı açık kaynak olarak yeniden yazdınız mı? Çatal mı?
Bazel, kodunun büyük kısmını dahili araçla paylaşıyor ve kuralları her gün milyonlarca derlemede kullanılmaktadır.
Google neden Bazel'i geliştirdi?
Google, uzun zaman önce yazılımını büyük ve üretilmiş Makefiles kullanarak geliştiriyordu. Bunlar yavaş ve güvenilir olmayan derlemelere yol açtı. Bu da geliştiricilerimizin üretkenliğini ve şirketin çevikliğini etkilemeye başladı. Bazel bu sorunları çözmenin bir yoluydu.
Bazel için derleme kümesi gerekir mi?
Bazel, varsayılan olarak derleme işlemlerini yerel olarak çalıştırır. Ancak Bazel daha da hızlı derleme ve testler için derleme kümesine de bağlanabilir. Daha ayrıntılı bilgi için uzaktan yürütme ve önbelleğe alma ve uzaktan önbelleğe alma ile ilgili dokümanlarımıza bakın.
Google geliştirme süreci nasıl işler?
Sunucu kod tabanımız için aşağıdaki geliştirme iş akışını kullanırız:
- Sunucu kodumuz, tek ve devasa bir sürüm kontrol sisteminde yer alır.
- Herkes yazılımını Bazel ile geliştiriyor.
- Farklı ekipler kaynak ağacın farklı bölümlerine sahiptir ve kendi bileşenlerini
BUILD
hedefleri olarak kullanılabilir hale getirir. - Dallara ayırma birincil olarak sürümlerin yönetilmesi için kullanılır. Bu nedenle herkes, yazılımını en baştaki düzeltme sırasında geliştirir.
Bazel, bu felsefenin temel taşıdır: Bazel tüm bağımlılıkların tam olarak belirtilmesini gerektirdiğinden, hangi program ve testlerin bir değişiklikten etkileneceğini tahmin edebiliyor ve bunları gönderilmeden önce değerlendirebiliyoruz.
Google'daki geliştirme süreciyle ilgili daha fazla bilgiyi eng araçları blogunda bulabilirsiniz.
Bazel'i neden açtınız?
Yazılım geliştirme eğlenceli ve kolay olmalıdır. Yavaş ve öngörülemez derlemeler programlamanın eğlencesini kaldırır.
Neden Bazel'ı kullanmak isteyeyim?
- Bazel, yalnızca yeniden derlenmesi gereken dosyaları yeniden derleyebildiği için size daha hızlı derleme süreleri sunabilir. Benzer şekilde, değişmediğini bildiği yeniden çalıştırma testleri de atlayabilir.
- Bazel ise deterministik sonuçlar verir. Bu da artımlı ve temiz derlemeler, dizüstü bilgisayar ve CI sistemi vb. arasındaki sapmayı ortadan kaldırır.
- Bazel aynı çalışma alanındaki aynı aracı kullanarak farklı istemci ve sunucu uygulamaları oluşturabilir. Örneğin, bir istemci/sunucu protokolünü tek bir kayıtta değiştirebilir ve güncellenen mobil uygulamanın güncellenmiş sunucuyla çalışıp çalışmadığını test edebilir, her ikisini de aynı araçla derleyebilir ve Bazel'in yukarıda belirtilen tüm avantajlarından yararlanabilirsiniz.
Örnekleri görebilir miyim?
Evet; basit bir örneği inceleyin veya daha karmaşık bir örnek için Bazel kaynak kodunu okuyun.
Bazel'in en iyisi hangisi?
Bazel, aşağıdaki mülklere sahip projeleri oluşturma ve test etme konusunda uzmanlaşıyor:
- Geniş kod tabanına sahip projeler
- Birden çok derlenmiş dilde yazılmış projeler
- Birden fazla platformda dağıtılan projeler
- Kapsamlı testleri içeren projeler
Bazel'i nerede çalıştırabilirim?
Bazel; Linux, macOS (OS X) ve Windows'da çalışır.
Platform için bir JDK kullanılabildiği sürece diğer UNIX platformlarına bağlantı kurmak nispeten kolay olacaktır.
Bazel'ı ne için kullanmamalıyım?
- Bazel, önbelleğe alma konusunda akıllı davranmaya çalışıyor. Bu, çıkışlarının önbelleğe alınmaması gereken derleme işlemlerini çalıştırmak için uygun olmadığı anlamına gelir. Örneğin, aşağıdaki adımlar Bazel'den çalıştırılmamalıdır:
- İnternetten veri getiren bir derleme adımı.
- Sitenizin kalite güvencesi örneğine bağlanan bir test adımıdır.
- Sitenizin bulut yapılandırmasını değiştiren bir dağıtım adımıdır.
- Derlemeniz uzun ve sıralı birkaç adımdan oluşuyorsa Bazel size pek yardımcı olamayabilir. Uzun adımları Bazel'in paralel olarak çalıştırabileceği daha küçük, ayrı hedeflere bölerek daha fazla hız elde edebilirsiniz.
Bazel'in özellik grubu ne kadar istikrarlı?
Temel özellikler (C++, Java ve kabuk kuralları) Google'da yoğun bir şekilde kullanıldığından kapsamlı bir şekilde test edilmiştir ve uygulamadaki kayıpları çok azdır. Benzer şekilde, gerilemeleri bulmak için Bazel'in yeni sürümlerini her gün yüz binlerce hedefte test ediyoruz ve her ay birkaç kez yeni sürümleri yayınlıyoruz.
Kısacası, deneysel olarak işaretlenen özellikler hariç, Bazel'ın çalışması gerekir. Deneysel olmayan kurallarda yapılan değişiklikler geriye dönük uyumlu olacaktır. Özellik desteği durumlarının daha ayrıntılı bir listesini destek dokümanımızda bulabilirsiniz.
İkili program olarak Bazel ne kadar istikrarlı?
Google içinde, Bazel kilitlenmelerinin çok nadir olmasını sağlıyoruz. Bu durum, açık kaynak kod tabanımız için de geçerli olacaktır.
Bazel'ı kullanmaya nasıl başlayabilirim?
Başlarken sayfasına göz atın.
Docker, tekrar üretilebilirlik sorunlarını çözmüyor mu?
Docker ile kolayca, sabit işletim sistemi sürümleri (ör. Ubuntu 12.04, Fedora 21) içeren korumalı alanlar oluşturabilirsiniz. Bu, sistem ortamı için yeniden oluşturulabilirlik sorununu çözer. Yani “hangi /usr/bin/c++ sürümüne ihtiyacım var?”
Docker, kaynak koddaki değişikliklerle ilgili olarak tekrar oluşturulabilirlik konusunu ele almaz. Yapma işlemini Docker container'da kusursuz şekilde yazılmış bir Makefile ile çalıştırmak, yine de öngörülemeyen sonuçlara yol açabilir.
Google'da araçları, yeniden üretilebilirlik için kaynak denetimiyle birlikte kontrol ediyoruz. Bu şekilde, araçlarda yapılan değişiklikleri ("GCC'yi 4.6.1'e yükseltme"), temel kitaplıklardaki değişikliklerle aynı mekanizmaya sahip ("OpenSSL'de sınırları düzeltme") inceleyebiliriz.
Docker'da dağıtım için ikili programlar oluşturabilir miyim?
Bazel ile C/C++'ta bağımsız, statik olarak bağlantılı ikili programlar ve Java için bağımsız jar dosyaları oluşturabilirsiniz. Bunlar normal UNIX sistemlerinde az sayıda bağımlılıkla çalışır ve bu nedenle Docker container'ının içine kolayca kurulabilir.
Bazel'in, bir veri dosyası kümesi kullanan veya alt işlem olarak başka bir programı çalıştıran Java programı gibi daha karmaşık programların yapılandırılması için kuralları vardır. Bu tür ortamları bağımsız arşivler olarak paketlemek mümkündür. Böylece, Docker görüntüleri dahil olmak üzere farklı sistemlere dağıtılabilirler.
Bazel ile Docker görüntüleri oluşturabilir miyim?
Evet, yeniden oluşturulabilir Docker görüntüleri oluşturmak için Docker kurallarımızı kullanabilirsiniz.
Bazel, derlemelerimi otomatik olarak yeniden oluşturulabilir hale getirecek mi?
Araç zincirini değiştirmediğinizi varsayarsak Java ve C++ ikili programları için evet. Özel tarifler içeren derleme adımlarınız varsa (örneğin, bir kural içindeki kabuk komut dosyası aracılığıyla ikili programlar yürütme) biraz daha dikkatli olmanız gerekir:
- Beyan edilmemiş bağımlılıkları kullanmayın. Korumalı alana alınan yürütme (–spawn_strategy=sandboxed, yalnızca Linux'ta), bildirilmeyen bağımlılıkları bulmanıza yardımcı olabilir.
- Oluşturulan dosyalarda zaman damgaları ve User-ID'leri depolamaktan kaçının. ZIP dosyaları ve diğer arşivler bu duruma özellikle açıktır.
- Ağa bağlanmaktan kaçının. Korumalı alanlı yürütme burada da yardımcı olabilir.
- Rastgele sayıların kullanıldığı işlemlerden kaçının. Özellikle de sözlük geçişi birçok programlama dilinde rastgele hale getirilmiştir.
İkili sürümünüz var mı?
Evet, en son yayın ikililerini bulabilir ve yayın politikamızı inceleyebilirsiniz.
Eclipse/IntelliJ/XCode kullanıyorum. Bazel, entegre geliştirme ortamlarıyla nasıl birlikte çalışır?
IntelliJ için IntelliJ with Bazel eklentisine göz atın.
XCode için Tulsi'ye göz atın.
Eclipse için E4B eklentisine göz atın.
Diğer IDE'ler için, bu eklentilerin nasıl çalıştığıyla ilgili blog yayınına göz atın.
Jenkins/CircleCI/TravisCI kullanıyorum. Bazel, CI sistemleriyle nasıl birlikte çalışır?
Derleme veya test çağrısı başarısız olursa Bazel sıfır dışında bir çıkış kodu döndürür ve bu, temel CI entegrasyonu için yeterli olacaktır. Bazel'in doğruluk için temiz derlemelere ihtiyacı olmadığından, CI sistemi derleme/test çalıştırmasına başlamadan önce temizlenecek şekilde yapılandırılmamalıdır.
Çıkış kodlarıyla ilgili daha ayrıntılı bilgileri Kullanıcı Kılavuzu'nda bulabilirsiniz.
Bazel'de gelecekte ne gibi özellikler görebiliriz?
Yol haritalarımıza bakın.
BURAYA DİL EKLEYİN projemde Bazel'ı kullanabilir miyim?
Bazel genişletilebilir. Herkes yeni diller için destek ekleyebilir. Birçok dil desteklenir: Öneri listesi için derleme ansiklopedi, daha kapsamlı bir liste için awesomebazel.com adresine bakın.
Uzantılar geliştirmek veya nasıl çalıştıklarını öğrenmek isterseniz Bazel'i genişletme dokümanlarını inceleyin.
Bazel kod tabanına katkıda bulunabilir miyim?
Katkıda bulunma kurallarımıza bakın.
Neden tüm geliştirme süreçleri açık havada gerçekleştirilmiyor?
Hala, Bazel'deki herkese açık kod ile dahili uzantılarımız arasındaki arayüzleri sık sık yeniden düzenlememiz gerekiyor. Bu da açık ortamda pek çok geliştirme yapmayı zorlaştırır.
Bazel'i açık kaynaklı hale getirmeyi bitirdiniz mi?
Açık kaynaklı Bazel kullanımı devam eden bir çalışmadır. Özellikle, açık kaynak bulma konusunda çalışmaya devam ediyoruz:
- Birim ve entegrasyon testlerimizin çoğu (yama eklemeyi kolaylaştıracaktır).
- Tam IDE entegrasyonu.
Kodlamanın ötesinde, tüm kod incelemelerinin, hata izleme ve tasarım kararlarının Bazel topluluğunun da sürece dahil olduğu herkese açık bir şekilde uygulanmasını istiyoruz. Henüz o noktaya ulaşmadık. Bu nedenle, bazı değişiklikler, net bir açıklama olmadan Bazel deposunda görünecek. Bu şeffaflık eksikliğine rağmen harici geliştiricileri desteklemek ve işbirliği yapmak istiyoruz. Bu yüzden, bazı geliştirmeler Google'da hâlâ devam ediyor olsa da, kodu kullanıma açıyoruz. Açık modele geçişimiz sırasında net olmayan veya haksız görünen herhangi bir şey varsa lütfen bize bildirin.
Bazel'da hiçbir zaman açık kaynaklı olmayacak bölümleri var mı?
Evet, kod tabanının bir kısmı ya Google'a özgü teknolojiyle entegre olabilir ya da ondan kurtulmak için bir bahane arıyorduk (ya da bu ikisinin birleşiminden oluşuyor). Kod tabanının bu bölümleri GitHub'da mevcut değildir ve muhtemelen hiçbir zaman sunulmayacaktır.
Ekiple nasıl iletişime geçebilirim?
Bize bazel-talk@googlegroups.com adresinden ulaşabilirsiniz.
Yazılım hatalarını nereden bildirebilirim?
GitHub'da bir sorun açın.
Kod tabanındaki "Blaze" kelimesiyle ne oldu?
Bu, aracın dahili adıdır. Lütfen Blaze'e Bazel olarak bakın.
Diğer Google projelerinde (Android, Chrome) neden başka geliştirme araçları kullanılıyor?
Bazel ilk (Alfa) sürüme kadar harici olarak kullanıma sunulmadığı için Chromium ve Android gibi açık kaynak projeler bu Bazel'ı kullanamıyordu. Ayrıca, ilk başta Windows desteğinin olmaması, Chrome gibi Windows uygulamalarının derlenmesiyle ilgili bir sorundu. Proje olgunlaştığı ve daha kararlı hale geldiği için, Android Açık Kaynak Projesi Bazel'a taşınma sürecindedir.
"Bazel" nasıl telaffuz edilir?
ABD İngilizcesindeki "fesleğen" ile aynı şekilde: "BAY-zel". "Fındık" ile kafiyeli. IPA: /bez㌣//