Giriş
Bazel'i kullanmaya yeni mi başladınız? Doğru yerdesiniz. Şu İlk Derleme eğiticisini takip edin: Bazel kullanımı basitleştirilmiştir. Bu eğitimde, anahtar terimlerin temelleri Bazel bağlamında kullanılacak ve Bazel ile ilgili temel iş akışını takip edin. İhtiyacınız olan araçlarla başlayarak, üç temel araç oluşturup giderek daha karmaşık hale gelen projelere göz atacak ve işlerin nasıl ve neden daha karmaşık hale geldiğini öğreneceksiniz.
Bazel ise bir derleme sistemi Çok dilli derlemeleri desteklediğinden bu eğiticide örnek olarak bir C++ projesi kullanılmıştır ve çoğu dilde geçerli olan genel yönergeleri ve adımları içerir.
Tahmini tamamlanma süresi: 30 dakika.
Ön koşullar
Henüz yüklemediyseniz Bazel'i yükleyerek başlayın zaten. Bu eğitim, kaynak kontrolü için Git'i kullandığından en iyi sonuçları elde etmek için Git'i farklı bir şekilde olur.
Sonra, aşağıdaki komutu çalıştırarak Bazel'in GitHub deposundan örnek projeyi alın: komut satırı aracınızla aşağıdaki işlemleri yapabilirsiniz:
git clone https://github.com/bazelbuild/examples
Bu eğitim için örnek proje examples/cpp-tutorial
dizinindedir.
Nasıl yapılandırıldığına aşağıda göz atabilirsiniz:
examples
└── cpp-tutorial
├──stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ └── WORKSPACE
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
Bu eğiticide, her biri bir aşamayı temsil eden üç dosya grubu vardır. İlk aşamada, tek bir paket içinde yer alan tek bir hedef oluşturacaksınız. İkinci aşamada ise tek bir paketten hem ikili program hem de kitaplık derleme. İçinde üçüncü ve son aşamada ise birden fazla paket ve teslimatlar içeren bir proje yapıyı birden çok hedefle oluşturabilirsiniz.
Özet: Giriş
Bu eğitim için Bazel (ve Git) hizmetini yükleyip depoyu klonlayarak ilk binanızın temelini attınız. Sonrakine geç bölümünü inceleyin ve çalışma alanınızı ayarlayın.
Başlarken
Çalışma alanını ayarlama
Bir proje oluşturmadan önce projenin çalışma alanını oluşturmanız gerekir. Çalışma alanı projenizin kaynak dosyalarını ve Bazel'ın derleme çıkışlarını barındıran bir dizindir. Google aşağıdaki önemli dosyaları da içermektedir:
- Dizini ve içeriğini Bazel çalışma alanı olarak tanımlayan
projenin dizin yapısının kökünde bulunur.WORKSPACE
file - Bazel'e projenin farklı bölümlerini nasıl oluşturacağını bildiren bir veya daha fazla
. CEVAP çalışma alanında yer alanBUILD
filesBUILD
dosyası içeren dizin package. (Paketler hakkında daha fazla bilgi) daha fazla bilgi edinebilirsiniz.)
Gelecekteki projelerde bir dizini Bazel çalışma alanı olarak belirlemek için
bu dizinde WORKSPACE
adlı boş bir dosya olması gerekir. Bu eğiticide
her aşamada zaten WORKSPACE
dosyası var.
NOT: Bazel projeyi oluşturduğunda tüm girişler aynı çalışma alanında olması gerekir. Farklı çalışma alanlarında bulunan dosyalar birbirine bağlamaz. Çalışma alanı kuralları hakkında daha ayrıntılı bilgi için bu kılavuzda bulabilirsiniz.
BUILD dosyasını anlama
BUILD
dosyası, Bazel için farklı türde talimatları içerir. Her biri
BUILD
dosyası en az bir kural gerektiriyor
Bazel'a istenen çıktıları nasıl oluşturacağını anlatan bir dizi talimat olarak
yürütülebilir ikili programlar veya kitaplıklar gibi. Derleme kuralının
BUILD
dosyası hedef olarak adlandırılır
ve belirli bir kaynak dosya ve bağımlılık grubunu işaret eder.
Bir hedef, başka hedefleri de gösterebilir.
cpp-tutorial/stage1/main
dizinindeki BUILD
dosyasına göz atın:
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
Örneğimizde hello-world
hedefi, Bazel'in yerleşik
cc_binary rule
.
Kural, Bazel'a
Bağımlılığı olmayan hello-world.cc
kaynak dosya.
Özet: başlarken
Artık bazı anahtar terimleri ve bu terimlerin bu terimlerin genel olarak Bazel’ı düşünmekte fayda var. Bir sonraki bölümde, bir projeyi başarılı bir şekilde Projenin 1. aşaması.
1. Aşama: tek hedef, tek paket
Projenin ilk bölümünü inşa etme zamanı geldi. Görsel referans olması açısından, projenin 1. Aşama bölümünün yapısı şöyledir:
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── WORKSPACE
cpp-tutorial/stage1
dizinine taşımak için aşağıdaki komutu çalıştırın:
cd cpp-tutorial/stage1
Ardından şu komutu çalıştırın:
bazel build //main:hello-world
Hedef etikette, //main:
bölümü BUILD
dosyasının konumudur
çalışma alanının köküne göre belirlenmiştir ve hello-world
,
BUILD
dosyası.
Bazel aşağıdakine benzer bir sonuç üretir:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.267s, Critical Path: 0.25s
İlk Bazel hedefinizi oluşturdunuz. Bazel, derleme çıktılarını
kök dizinindeki bazel-bin
dizini
çalışmayacaktır.
Şimdi, yeni derlenen ikili programınızı test edin:
bazel-bin/main/hello-world
Bu işlem, basılı bir "Hello world
" iletisiyle sonuçlanır.
1. Aşamanın bağımlılık grafiği şöyle olabilir:
Özet: 1. aşama
İlk derlemenizi tamamladığınıza göre, artık binanın nasıl yapılandırılmıştır. Bir sonraki aşamada, yeni bir boyut ekleyerek hedefi belirleyebilirsiniz.
2. Aşama: Birden fazla derleme hedefi
Küçük projeler için tek bir hedef yeterli olsa da her projeyi birden çok hedef ve pakete dönüştürmenize yardımcı olur. Bu sayede ekip üyeleri artımlı derlemeler sunar (yani Bazel yalnızca değişiklikleri yeniden oluşturur) ve projenin birden çok parçasını aynı anda inşa ederek çalışır. Sürecin bu aşaması eğitici bir hedef ekler, sonraki adımda da bir paket eklenir.
2. Aşama için çalıştığınız dizin şu şekildedir:
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
cpp-tutorial/stage2/main
dizinindeki BUILD
dosyasına göz atın:
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
],
)
Bazel, bu BUILD
dosyasıyla önce hello-greet
kitaplığını oluşturur
(Bazel'in yerleşik cc_library rule
özelliğini kullanarak),
ve hello-world
ikili değeri. Şuradaki deps
özelliği:
hello-world
hedefi Bazel'e hello-greet
kitaplığı, hello-world
ikili programını derlemek için gereklidir.
Projenin bu yeni sürümünü oluşturabilmek için
aşağıdaki komutu çalıştırarak cpp-tutorial/stage2
dizinine geçebilirsiniz:
cd ../stage2
Artık aşağıdaki bilinen komutu kullanarak yeni ikili programı derleyebilirsiniz:
bazel build //main:hello-world
Bir kez daha Bazel aşağıdaki gibi bir şey üretir:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.399s, Critical Path: 0.30s
Artık başka bir "Hello world
" döndüren yeni derlenmiş ikili programınızı test edebilirsiniz:
bazel-bin/main/hello-world
Şimdi hello-greet.cc
öğesini değiştirip projeyi yeniden derlerseniz Bazel yalnızca yeniden derler
yapabilirsiniz.
Bağımlılık grafiğine baktığınızda, hello-world
değerinin ekstra bir girdiye bağlı olduğunu görebilirsiniz
hello-greet
adlı:
Özet: 2. aşama
Projeyi iki hedefle oluşturmuş oldunuz. hello-world
hedefi derlemeleri
bir kaynak dosyadır ve başka bir hedefe (//main:hello-greet
) bağlıdır.
iki ek kaynak dosyası oluşturur. Bir sonraki bölümde,
ve başka bir paket ekleyin.
3. Aşama: Birden fazla paket
Bir sonraki aşama bir komplikasyon katmanı daha ekler ve
birden çok pakete sahip olabilir. Aşağıdaki yapı ve içeriklere göz atın:
cpp-tutorial/stage3
dizini:
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
Gördüğünüz üzere iki alt dizin vardır ve her biri bir BUILD
içerir.
dosyası olarak kaydedebilirsiniz. Dolayısıyla, Bazel için çalışma alanı artık iki paket içeriyor: lib
ve
main
.
lib/BUILD
dosyasına göz atın:
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"],
)
main/BUILD
dosyasında:
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
"//lib:hello-time",
],
)
Ana paketteki hello-world
hedefi, hello-time
hedefine bağlıdır
(dolayısıyla hedef etiket //lib:hello-time
) içine lib
bunu deps
özelliği aracılığıyla gönderebilirsiniz. Bu, bağımlı bir soruna
grafik:
Derlemenin başarılı olması için lib/BUILD
ürününde //lib:hello-time
hedefini yaparsınız.
görünürlük özelliğini kullanan main/BUILD
içindeki hedeflere açıkça görüntülenebilir.
Bunun nedeni, hedeflerin varsayılan olarak yalnızca aynı
BUILD
dosyası yükleyin. Bazel, kitaplık gibi sorunları önlemek için hedef görünürlük kullanıyor
herkese açık API'lere sızdırılan uygulama ayrıntılarını içerir.
Şimdi projenin bu son sürümünü derleyin. cpp-tutorial/stage3
cihazına geç
dizini şu şekilde çalıştırın:
cd ../stage3
Bir kez daha aşağıdaki komutu çalıştırın:
bazel build //main:hello-world
Bazel aşağıdakine benzer bir sonuç üretir:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 0.167s, Critical Path: 0.00s
Şimdi, bu eğiticinin son ikili programındaki son Hello world
mesajını test edin:
bazel-bin/main/hello-world
Özet: 3. aşama
Projeyi üç hedefi olan iki paket halinde oluşturdunuz ve ve bunlar arasındaki bağımlılıkları fark etmenizi sağlar. Bu da gelecek projelerde başka projeleri de var. Sonraki bölümde, Bazel yolculuğu.
Sonraki adımlar
Bazel ile ilk temel derlemenizi tamamladınız, ancak başlatabilirsiniz. Bazel ile öğrenmeye devam etmek için aşağıdaki diğer kaynakları kullanabilirsiniz:
- C++'a odaklanmaya devam etmek için yaygın C++ derlemesi kullanım alanları hakkında bilgi edinin.
- Bazel ile başka uygulamalar derlemeye başlamak için aşağıdaki eğiticilere göz atın Java, Android uygulaması için veya iOS uygulaması) kullanılabilir.
- Yerel ve uzak kod depolarıyla çalışma hakkında daha fazla bilgi edinmek için şu makaleyi okuyun: dış bağımlılıklara yol açabilir.
- Bazel'in diğer kuralları hakkında daha fazla bilgi edinmek için bu referans kılavuzunu inceleyin.
Mutlu binalar!