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 kullanımı ve Bazel bağlamında size Bazel yönetiminin temellerini 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ğiticide kaynak kontrolü için Git kullanıldığından en iyi sonuçları elde etmek için Git'i de tıklayabilirsiniz.
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ğitimin örnek projesi examples/cpp-tutorial
içindedir
dizin.
Nasıl yapılandırıldığına göz atın:
examples
└── cpp-tutorial
├──stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ └── MODULE.bazel
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── MODULE.bazel
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── MODULE.bazel
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. Üçüncü ve son aşamasında birden fazla paket içeren bir proje geliştirecek ve birden çok hedefe sahip olabilir.
Ö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ünde bazı terimler tanımlamak ve Workspace'i seçin.
Başlarken
Bir proje oluşturmadan önce projenin çalışma alanını oluşturmanız gerekir. Çalışma alanı projenizin kaynak dosyalarını ve Bazel'in derleme çıkışlarını barındıran bir dizindir. Ayrıca, aşağıdaki önemli dosyaları da içerir:
- Dizini ve içeriğini
MODULE.bazel
bir Bazel çalışma alanıdır ve proje dizininin kökünde bulunur inceleyeceğiz. Aynı zamanda dış bağımlılıklarınızı da belirtirsiniz. - Bir veya daha fazla
BUILD
dosyalar oluşturup Bazel'a nasıl yapılacağını göstereceğim. Şu dizinin içindeki bir dizin:BUILD
dosyası içeren çalışma alanı 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 MODULE.bazel
adlı boş bir dosya olması gerekir. Bu Sözleşme'nin amaçları doğrultusunda,
eğiticide, her aşamada zaten bir MODULE.bazel
dosyası mevcuttur.
BUILD dosyasını anlama
BUILD
dosyası, Bazel için farklı türde talimatları içerir. Her biri
BUILD
dosya için en az bir tane gerekli
rule'yi bir dizi talimat olarak izlerseniz
Bu komut, Bazel'a yürütülebilir ikili programlar gibi istediğiniz çıktıları nasıl oluşturacağını söyler
veya kitaplıklarda da olabilir. BUILD
dosyasındaki bir derleme kuralının her bir örneğine
belirli bir yeri hedefler ve
bir dizi kaynak dosya ve
bağımlılıkları belirler. Bir hedef,
diğer hedeflere işaret ediyor.
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
kural. Kural
Bazel'a
hello-world.cc
> kaynak dosyadan oluşur.
Ö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
└── MODULE.bazel
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ı
Çalışma alanının kök dizininde bulunan bazel-bin
dizini.
Şimdi, yeni derlenen ikili programınızı test edin:
bazel-bin/main/hello-world
Bu, basılı bir "Hello world
" ile sonuçlanır mesajını alırsınız.
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 bir projeyi nasıl nasıl yapılandırıldığını anlamasına yardım eder. Bir sonraki aşamada, çalışma alanına anlamına gelir.
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 yapılarınıza hızlıca dahil edebilirsiniz. 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
│ └── MODULE.bazel
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
kural), ardından
hello-world
ikili. hello-world
hedefindeki deps
özelliği şunları belirtir:
hello-world
derlemesi için hello-greet
kitaplığının gerekli olduğunu söyleyen Bazel
ikilik.
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 yalnızca Bazel
bu dosyayı yeniden derler.
Bağımlılık grafiğine baktığınızda hello-world
değerinin bir bağımlılığa bağlı olarak
hello-greet
adlı fazladan giriş:
Ö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. Belgenin yapısına ve içeriğine 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
└── MODULE.bazel
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 bu yalnızca başlatabilirsiniz. Bazel ile öğrenmeye devam etmek için aşağıdaki diğer kaynakları kullanabilirsiniz:
- C++'a odaklanmaya devam etmek için, C++ ile ilgili genel C++ derleme kullanımı durumlar için de geçerlidir.
- Bazel ile başka uygulamalar oluşturmaya başlamak için Java, Android için eğiticiler uygulama veya iOS değiştirebilirsiniz.
- 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 referansa rehberini inceleyin.
Mutlu binalar!