Pengantar
Baru mengenal Bazel? Anda berada di tempat yang tepat. Ikuti tutorial Build Pertama ini untuk mendapatkan pengantar yang disederhanakan tentang penggunaan Bazel. Tutorial ini menentukan istilah utama seperti yang digunakan dalam konteks Bazel dan memandu Anda mempelajari dasar-dasar alur kerja Bazel. Mulai dari alat yang Anda butuhkan, Anda akan mem-build dan menjalankan tiga project dengan kompleksitas yang meningkat dan mempelajari cara serta alasan project menjadi lebih kompleks.
Meskipun Bazel adalah sistem build yang mendukung build multibahasa, tutorial ini menggunakan project C++ sebagai contoh dan memberikan panduan dan alur umum yang berlaku untuk sebagian besar bahasa.
Estimasi waktu penyelesaian: 30 menit.
Prasyarat
Mulai dengan menginstal Bazel, jika Anda belum melakukannya. Tutorial ini menggunakan Git untuk kontrol sumber, jadi untuk hasil terbaik, instal juga Git.
Selanjutnya, ambil project contoh dari repositori GitHub Bazel dengan menjalankan hal berikut di alat command line pilihan Anda:
git clone https://github.com/bazelbuild/examples
Project contoh untuk tutorial ini ada di direktori examples/cpp-tutorial
.
Lihat strukturnya:
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
Ada tiga kumpulan file, setiap kumpulan mewakili tahap dalam tutorial ini. Pada tahap pertama, Anda akan membangun satu target yang berada dalam satu paket. Pada tahap kedua, Anda akan mem-build biner dan library dari satu paket. Pada tahap ketiga dan terakhir, Anda akan mem-build project dengan beberapa paket dan mem-build-nya dengan beberapa target.
Ringkasan: Pengantar
Dengan menginstal Bazel (dan Git) serta meng-clone repositori untuk tutorial ini, Anda telah meletakkan dasar untuk build pertama dengan Bazel. Lanjutkan ke bagian berikutnya untuk menentukan beberapa istilah dan menyiapkan ruang kerja Anda.
Memulai
Sebelum dapat mem-build project, Anda harus menyiapkan ruang kerjanya. Ruang kerja adalah direktori yang menyimpan file sumber project dan output build Bazel. File ini juga berisi file penting berikut:
- File
MODULE.bazel
, yang mengidentifikasi direktori dan kontennya sebagai ruang kerja Bazel dan berada di root struktur direktori project. Di sini juga Anda menentukan dependensi eksternal. - Satu atau beberapa file
BUILD
, yang memberi tahu Bazel cara mem-build berbagai bagian project. Direktori dalam ruang kerja yang berisi fileBUILD
adalah paket. (Selengkapnya tentang paket nanti dalam tutorial ini.)
Pada project mendatang, untuk menetapkan direktori sebagai ruang kerja Bazel, buat
file kosong bernama MODULE.bazel
di direktori tersebut. Untuk tujuan
tutorial ini, file MODULE.bazel
sudah ada di setiap tahap.
Memahami file BUILD
File BUILD
berisi beberapa jenis petunjuk yang berbeda untuk Bazel. Setiap
file BUILD
memerlukan minimal satu
aturan sebagai kumpulan petunjuk,
yang memberi tahu Bazel cara mem-build output yang Anda inginkan, seperti library
atau biner yang dapat dieksekusi. Setiap instance aturan build dalam file BUILD
disebut
target dan mengarah ke kumpulan
file sumber dan
dependensi tertentu. Target juga dapat mengarah ke target lain.
Lihat file BUILD
di direktori cpp-tutorial/stage1/main
:
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
Dalam contoh kita, target hello-world
membuat instance
aturan cc_binary
bawaan Bazel. Aturan ini
memberi tahu Bazel untuk mem-build biner yang dapat dieksekusi mandiri dari
file sumber hello-world.cc
> tanpa dependensi.
Ringkasan: memulai
Sekarang Anda sudah memahami beberapa istilah utama, dan artinya dalam konteks project ini dan Bazel secara umum. Di bagian berikutnya, Anda akan membangun dan menguji Tahap 1 project.
Tahap 1: satu target, satu paket
Saatnya membuat bagian pertama project. Untuk referensi visual, struktur bagian Tahap 1 project adalah:
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── MODULE.bazel
Jalankan perintah berikut untuk berpindah ke direktori cpp-tutorial/stage1
:
cd cpp-tutorial/stage1
Kemudian jalankan:
bazel build //main:hello-world
Dalam label target, bagian //main:
adalah lokasi file BUILD
yang terkait dengan root ruang kerja, dan hello-world
adalah nama target dalam
file BUILD
.
Bazel menghasilkan sesuatu yang terlihat seperti ini:
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
Anda baru saja mem-build target Bazel pertama Anda. Bazel menempatkan output build di
direktori bazel-bin
di root ruang kerja.
Sekarang, uji biner yang baru Anda build, yaitu:
bazel-bin/main/hello-world
Tindakan ini akan menghasilkan pesan "Hello world
" yang dicetak.
Berikut adalah grafik dependensi Tahap 1:
Ringkasan: tahap 1
Setelah menyelesaikan build pertama, Anda memiliki gambaran dasar tentang cara build disusun. Pada tahap berikutnya, Anda akan menambahkan kompleksitas dengan menambahkan target lain.
Tahap 2: beberapa target build
Meskipun satu target sudah cukup untuk project kecil, Anda dapat membagi project yang lebih besar menjadi beberapa target dan paket. Hal ini memungkinkan build inkremental yang cepat – yaitu, Bazel hanya mem-build ulang yang telah berubah – dan mempercepat build Anda dengan mem-build beberapa bagian project sekaligus. Tahap tutorial ini menambahkan target, dan tahap berikutnya menambahkan paket.
Ini adalah direktori yang sedang Anda gunakan untuk Tahap 2:
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── MODULE.bazel
Lihat file BUILD
di direktori cpp-tutorial/stage2/main
:
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",
],
)
Dengan file BUILD
ini, pertama-tama Bazel akan membangun library hello-greet
(menggunakan
aturan
cc_library
bawaan Bazel), lalu biner
hello-world
. Atribut deps
di target hello-world
memberi tahu
Bazel bahwa library hello-greet
diperlukan untuk mem-build biner
hello-world
.
Sebelum dapat mem-build project versi baru ini, Anda perlu mengubah
direktori, beralih ke direktori cpp-tutorial/stage2
dengan menjalankan:
cd ../stage2
Sekarang Anda dapat mem-build biner baru menggunakan perintah umum berikut:
bazel build //main:hello-world
Sekali lagi, Bazel menghasilkan sesuatu yang terlihat seperti ini:
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
Sekarang Anda dapat menguji biner yang baru dibuat, yang menampilkan "Hello
world
" lain:
bazel-bin/main/hello-world
Jika sekarang Anda mengubah hello-greet.cc
dan mem-build ulang project, Bazel hanya
akan mengompilasi ulang file tersebut.
Dengan melihat grafik dependensi, Anda dapat melihat bahwa hello-world
bergantung pada
input tambahan bernama hello-greet
:
Ringkasan: tahap 2
Sekarang Anda telah mem-build project dengan dua target. Target hello-world
mem-build
satu file sumber dan bergantung pada satu target lain (//main:hello-greet
), yang
mem-build dua file sumber tambahan. Di bagian berikutnya, lanjutkan
dan tambahkan paket lain.
Tahap 3: beberapa paket
Tahap berikutnya ini menambahkan lapisan kerumitan lain dan mem-build project dengan
beberapa paket. Lihat struktur dan konten
direktori cpp-tutorial/stage3
:
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── MODULE.bazel
Anda dapat melihat bahwa sekarang ada dua subdirektori, dan masing-masing berisi file
BUILD
. Oleh karena itu, untuk Bazel, ruang kerja kini berisi dua paket: lib
dan
main
.
Lihat file lib/BUILD
:
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"],
)
Dan pada file main/BUILD
:
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",
],
)
Target hello-world
dalam paket utama bergantung pada target hello-time
dalam paket lib
(sehingga label target //lib:hello-time
) - Bazel mengetahui
hal ini melalui atribut deps
. Anda dapat melihatnya tercermin dalam grafik
dependensi:
Agar build berhasil, buat target //lib:hello-time
di lib/BUILD
secara eksplisit terlihat oleh target di main/BUILD
menggunakan atribut visibilitas.
Hal ini karena secara default, target hanya terlihat oleh target lain dalam file
BUILD
yang sama. Bazel menggunakan visibilitas target untuk mencegah masalah seperti library
yang berisi detail implementasi yang bocor ke API publik.
Sekarang, build versi akhir project ini. Beralih ke direktori cpp-tutorial/stage3
dengan menjalankan:
cd ../stage3
Sekali lagi, jalankan perintah berikut:
bazel build //main:hello-world
Bazel menghasilkan sesuatu yang terlihat seperti ini:
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
Sekarang, uji biner terakhir tutorial ini untuk pesan Hello world
akhir:
bazel-bin/main/hello-world
Ringkasan: tahap 3
Sekarang, Anda telah membangun project sebagai dua paket dengan tiga target dan memahami dependensi di antara keduanya, sehingga Anda dapat melanjutkan dan membangun project masa depan dengan Bazel. Di bagian berikutnya, lihat cara melanjutkan perjalanan Bazel Anda.
Langkah berikutnya
Anda telah menyelesaikan build dasar pertama dengan Bazel, tetapi ini baru awalnya. Berikut beberapa referensi lainnya untuk melanjutkan pembelajaran dengan Bazel:
- Untuk tetap berfokus pada C++, baca kasus penggunaan build C++ yang umum.
- Untuk mulai mem-build aplikasi lain dengan Bazel, lihat tutorial untuk Java, aplikasi Android, atau aplikasi iOS.
- Untuk mempelajari lebih lanjut cara menggunakan repositori lokal dan jarak jauh, baca artikel tentang dependensi eksternal.
- Untuk mempelajari aturan Bazel lainnya lebih lanjut, lihat panduan referensi ini.
Selamat membangun!