Pengantar
Baru mengenal Bazel? Anda sudah berada di tempat yang tepat. Ikuti tutorial Pembuatan Pertama ini untuk mendapatkan pengantar sederhana tentang penggunaan Bazel. Tutorial ini mendefinisikan istilah kunci seperti digunakan dalam konteks Bazel dan memandu Anda memahami dasar-dasar Bazel alur kerja. Dimulai dengan alat yang Anda perlukan, Anda akan membangun dan menjalankan tiga proyek dengan kompleksitas yang meningkat dan mempelajari bagaimana dan mengapa proyek itu 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.
Perkiraan 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 Git juga.
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 di bawah ini cara penyusunannya:
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
Ada tiga kumpulan file, masing-masing kumpulan mewakili satu tahapan 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-buildnya 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
Menyiapkan ruang kerja
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:
, yang mengidentifikasi direktori dan kontennya sebagai ruang kerja Bazel dan berada di {i>root <i}dari struktur direktori proyek.WORKSPACE
file- Satu atau beberapa
, yang memberi tahu Bazel cara membuat berbagai bagian project. Direktori dalam ruang kerja yang berisi fileBUILD
filesBUILD
adalah paket. (Selengkapnya tentang paket nanti dalam tutorial ini.)
Dalam project mendatang, untuk menetapkan direktori sebagai ruang kerja Bazel, buat
file kosong bernama WORKSPACE
di direktori tersebut. Untuk tujuan tutorial ini,
file WORKSPACE
sudah ada di setiap tahap.
CATATAN: Saat Bazel mem-build project, semua input harus berada di ruang kerja yang sama. File yang berada di ruang kerja lain tidak bergantung pada satu sama lain kecuali ditautkan. Informasi yang lebih mendetail tentang aturan ruang kerja dapat ditemukan di panduan ini.
Memahami file BUILD
File BUILD
berisi beberapa jenis petunjuk yang berbeda untuk Bazel. Masing-masing
File BUILD
memerlukan setidaknya satu aturan
sebagai satu set instruksi, yang memberi tahu
Bazel cara membuat {i>output<i} yang diinginkan,
seperti biner atau library
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 bawaan Bazel
cc_binary rule
.
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 telah mengenal beberapa istilah kunci, dan apa artinya dalam konteks proyek ini dan Bazel secara umum. Di bagian berikutnya, Anda akan mem-build dan menguji Tahap 1 project.
Tahap 1: satu target, satu paket
Saatnya membangun bagian pertama proyek. Sebagai referensi visual, struktur bagian Tahap 1 project adalah:
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── WORKSPACE
Jalankan perintah berikut untuk berpindah ke direktori cpp-tutorial/stage1
:
cd cpp-tutorial/stage1
Kemudian jalankan:
bazel build //main:hello-world
Pada label target, bagian //main:
adalah lokasi file BUILD
secara relatif terhadap 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
Kamu baru saja membuat target Bazel pertama. Menempatkan Bazel membuat output di
Direktori bazel-bin
di root
Workspace.
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 struktur build. Pada tahap selanjutnya, Anda akan menambahkan kompleksitas dengan target.
Tahap 2: beberapa target build
Meskipun satu target sudah cukup untuk project kecil, sebaiknya Anda membagi proyek yang lebih besar menjadi beberapa target dan paket. Hal ini memungkinkan tambahan – yaitu, Bazel hanya membangun ulang apa yang berubah – dan mempercepat dibangun dengan membangun beberapa bagian proyek sekaligus. Tahap ini tutorial menambahkan target, dan selanjutnya menambahkan paket.
Ini adalah direktori yang Anda gunakan untuk Tahap 2:
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
Lihat file BUILD
di direktori cpp-tutorial/stage2/main
di bawah ini:
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, Bazel terlebih dahulu membangun library hello-greet
(menggunakan cc_library rule
bawaan Bazel),
lalu biner hello-world
. Atribut deps
dalam
target hello-world
memberi tahu Bazel bahwa library hello-greet
diperlukan untuk mem-build biner hello-world
.
Sebelum dapat membangun versi baru project ini, Anda perlu melakukan perubahan
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 Anda sekarang mengubah hello-greet.cc
dan mem-build ulang project, Bazel hanya akan mengompilasi ulang
file tersebut.
Pada grafik dependensi, Anda dapat melihat bahwa {i> hello-world<i} bergantung pada input yang sama seperti sebelumnya, tetapi struktur build-nya berbeda:
Ringkasan: tahap 2
Sekarang Anda telah membangun proyek dengan dua target. Target hello-world
di-build
satu file sumber dan bergantung pada satu target lain (//main:hello-greet
), yang
membangun dua file sumber tambahan. Di bagian berikutnya, lakukan lebih jauh
dan menambahkan paket lain.
Tahap 3: beberapa paket
Tahap berikutnya ini menambahkan lapisan detail lain dan membangun project dengan
beberapa paket. Lihat di bawah ini struktur dan isi dari
Direktori cpp-tutorial/stage3
:
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
Anda dapat melihat bahwa sekarang ada dua subdirektori, dan masing-masing berisi file
BUILD
. Oleh karena itu, bagi Bazel, ruang kerja sekarang 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 di dependensi
{i>graphic<i}:
Agar build berhasil, Anda membuat target //lib:hello-time
di lib/BUILD
terlihat secara eksplisit oleh target di main/BUILD
menggunakan atribut visibilitas.
Hal ini karena target default hanya terlihat oleh target lain dalam
File BUILD
. Bazel menggunakan visibilitas target untuk mencegah masalah seperti library
berisi detail implementasi yang bocor ke API publik.
Sekarang, bangun project versi akhir ini. Alihkan ke 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 dalam tutorial ini untuk melihat pesan Hello world
akhir:
bazel-bin/main/hello-world
Ringkasan: tahap 3
Anda sekarang telah membangun proyek sebagai dua paket dengan tiga target dan memahami ketergantungan di antara mereka, yang memungkinkan Anda untuk maju dan membangun masa depan proyek bersama Bazel. Di bagian berikutnya, lihat cara melanjutkan Perjalanan Bazel.
Langkah berikutnya
Anda sekarang telah menyelesaikan build dasar pertama Anda dengan Bazel, tetapi ini hanyalah memulai. Berikut adalah beberapa referensi lainnya untuk terus belajar dengan Bazel:
- Untuk tetap berfokus pada C++, baca kasus penggunaan build C++ umum.
- Untuk mulai membangun 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!