Halaman ini membahas panduan gaya dasar untuk Starlark dan juga menyertakan informasi tentang makro dan aturan.
Starlark adalah bahasa yang menentukan cara software dibuat, dan oleh karena itu, Starlark adalah bahasa pemrograman dan bahasa konfigurasi.
Anda akan menggunakan Starlark untuk menulis file BUILD, makro, dan aturan build. Makro dan aturan pada dasarnya adalah meta-bahasa - keduanya menentukan cara file BUILD ditulis.
File BUILD dimaksudkan agar sederhana dan berulang.
Semua software lebih sering dibaca daripada ditulis. Hal ini terutama berlaku untuk Starlark, karena engineer membaca file BUILD untuk memahami dependensi target mereka dan detail build mereka. Pembacaan ini sering kali terjadi secara sekilas, terburu-buru, atau secara paralel dengan menyelesaikan tugas lain. Oleh karena itu, kesederhanaan dan keterbacaan sangat penting agar pengguna dapat mengurai dan memahami file BUILD dengan cepat.
Saat pengguna membuka file BUILD, mereka ingin mengetahui daftar target dalam file dengan cepat; atau meninjau daftar sumber library C++ tersebut; atau menghapus dependensi dari biner Java tersebut. Setiap kali Anda menambahkan lapisan abstraksi, Anda akan mempersulit pengguna untuk melakukan tugas ini.
File BUILD juga dianalisis dan diperbarui oleh berbagai alat. Alat mungkin tidak dapat mengedit file BUILD jika menggunakan abstraksi. Dengan menjaga kesederhanaan file BUILD, Anda akan mendapatkan alat yang lebih baik. Seiring pertumbuhan codebase, semakin sering dilakukan perubahan di banyak file BUILD untuk memperbarui library atau melakukan pembersihan.
Saran umum
- Gunakan Buildifier sebagai pemformat dan linter.
- Ikuti panduan pengujian.
Gaya
Gaya Python
Jika ragu, ikuti panduan gaya PEP 8 jika memungkinkan. Secara khusus, gunakan empat, bukan dua spasi untuk indentasi guna mengikuti konvensi Python.
Karena
Starlark bukan Python,
beberapa aspek gaya Python tidak berlaku. Misalnya, PEP 8 menyarankan agar perbandingan dengan singleton dilakukan dengan is, yang bukan operator di Starlark.
Docstring
Dokumentasikan file dan fungsi menggunakan docstring.
Gunakan docstring di bagian atas setiap file .bzl, dan docstring untuk setiap fungsi publik.
Mendokumentasikan aturan dan aspek
Aturan dan aspek, beserta atributnya, serta penyedia dan kolomnya, harus didokumentasikan menggunakan argumen doc.
Konvensi penamaan
- Nama variabel dan fungsi menggunakan huruf kecil dengan kata-kata yang dipisahkan oleh garis bawah (
[a-z][a-z0-9_]*), seperticc_library. - Nilai pribadi tingkat atas dimulai dengan satu garis bawah. Bazel mewajibkan nilai pribadi tidak dapat digunakan dari file lain. Variabel lokal tidak boleh menggunakan awalan garis bawah.
Panjang baris
Seperti dalam file BUILD, tidak ada batasan panjang baris yang ketat karena label dapat panjang.
Jika memungkinkan, coba gunakan maksimal 79 karakter per baris (mengikuti panduan gaya Python's
style guide, PEP 8). Panduan ini tidak boleh diterapkan secara ketat: editor harus menampilkan lebih dari 80 kolom, perubahan otomatis akan sering kali memperkenalkan baris yang lebih panjang, dan manusia tidak boleh menghabiskan waktu untuk membagi baris yang sudah dapat dibaca.
Argumen kata kunci
Dalam argumen kata kunci, spasi di sekitar tanda sama dengan lebih disukai:
def fct(name, srcs):
filtered_srcs = my_filter(source = srcs)
native.cc_library(
name = name,
srcs = filtered_srcs,
testonly = True,
)
Nilai boolean
Pilih nilai True dan False (bukan 1 dan 0) untuk nilai boolean (seperti saat menggunakan atribut boolean dalam aturan).
Gunakan print hanya untuk proses debug
Jangan gunakan fungsi print() dalam kode produksi; fungsi ini hanya ditujukan untuk proses debug, dan akan mengirim spam ke semua pengguna langsung dan tidak langsung dari file .bzl Anda. Satu-satunya pengecualian adalah Anda dapat mengirimkan kode yang menggunakan print() jika kode tersebut dinonaktifkan
secara default dan hanya dapat diaktifkan dengan mengedit sumber -- misalnya, jika semua
penggunaan print() dilindungi oleh if DEBUG: dengan DEBUG dikodekan secara permanen ke
False. Perhatikan apakah pernyataan ini cukup berguna untuk membenarkan dampaknya terhadap keterbacaan.
Makro
Makro adalah fungsi yang membuat instance satu atau beberapa aturan selama fase pemuatan. Secara umum, gunakan aturan jika memungkinkan, bukan makro. Grafik build yang dilihat oleh pengguna tidak sama dengan yang digunakan oleh Bazel selama build - makro diperluas sebelum Bazel melakukan analisis grafik build apa pun.
Karena hal ini, jika terjadi masalah, pengguna harus memahami penerapan makro Anda untuk memecahkan masalah build. Selain itu, hasil bazel
query mungkin sulit diinterpretasikan karena target yang ditampilkan dalam hasil
berasal dari perluasan makro. Terakhir, aspek tidak mengetahui makro, sehingga alat yang bergantung pada aspek (IDE dan lainnya) mungkin gagal.
Penggunaan makro yang aman adalah untuk menentukan target tambahan yang dimaksudkan untuk direferensikan langsung di Bazel CLI atau dalam file BUILD: Dalam hal ini, hanya pengguna akhir target tersebut yang perlu mengetahuinya, dan masalah build apa pun yang disebabkan oleh makro tidak pernah jauh dari penggunaannya.
Untuk makro yang menentukan target yang dihasilkan (detail penerapan makro yang tidak boleh dirujuk di CLI atau bergantung pada target yang tidak dibuat instance-nya oleh makro tersebut), ikuti praktik terbaik ini:
- Makro harus mengambil argumen
namedan menentukan target dengan nama tersebut. Target tersebut menjadi target utama makro tersebut. - Target yang dihasilkan, yaitu semua target lain yang ditentukan oleh makro, harus:
- Memiliki nama yang diawali dengan
<name>. Misalnya, menggunakanname = '%s_bar' % (name). - Memiliki visibilitas terbatas (
//visibility:private), dan - Memiliki tag
manualuntuk menghindari perluasan dalam target karakter pengganti (:all,...,:*, dll.).
- Memiliki nama yang diawali dengan
namehanya boleh digunakan untuk mendapatkan nama target yang ditentukan oleh makro, dan bukan untuk hal lain. Misalnya, jangan gunakan nama untuk mendapatkan dependensi atau file input yang tidak dihasilkan oleh makro itu sendiri.- Semua target yang dibuat dalam makro harus digabungkan dengan cara tertentu ke target utama.
- Secara konvensional,
nameharus menjadi argumen pertama saat menentukan makro. - Pertahankan nama parameter dalam makro agar konsisten. Jika parameter diteruskan sebagai nilai atribut ke target utama, pertahankan nama yang sama. Jika parameter makro memiliki tujuan yang sama dengan atribut aturan umum, seperti
deps, beri nama seperti atribut (lihat di bawah). - Saat memanggil makro, gunakan hanya argumen kata kunci. Hal ini konsisten dengan aturan, dan sangat meningkatkan keterbacaan.
Engineer sering kali menulis makro jika Starlark API dari aturan yang relevan tidak cukup untuk kasus penggunaan tertentu, terlepas dari apakah aturan tersebut ditentukan dalam Bazel dalam kode native, atau di Starlark. Jika Anda menghadapi masalah ini, tanyakan kepada penulis aturan apakah mereka dapat memperluas API untuk mencapai sasaran Anda.
Sebagai aturan praktis, semakin banyak makro yang menyerupai aturan, semakin baik.
Lihat juga makro.
Aturan
- Aturan, aspek, dan atributnya harus menggunakan nama lower_case ("snake case").
- Nama aturan adalah kata benda yang mendeskripsikan jenis artefak utama yang dihasilkan oleh aturan, dari sudut pandang dependensinya (atau untuk aturan leaf, pengguna). Hal ini belum tentu merupakan akhiran file. Misalnya, aturan yang menghasilkan artefak C++ yang dimaksudkan untuk digunakan sebagai ekstensi Python dapat disebut
py_extension. Untuk sebagian besar bahasa, aturan umum mencakup:*_library- unit kompilasi atau "modul".*_binary- target yang menghasilkan executable atau unit deployment.*_test- target pengujian. Hal ini dapat mencakup beberapa pengujian. Semua pengujian dalam target*_testdiharapkan merupakan variasi dari tema yang sama, misalnya, menguji satu library.*_import: target yang mengenkapsulasi artefak yang telah dikompilasi sebelumnya, seperti.jar, atau.dllyang digunakan selama kompilasi.
- Gunakan nama dan jenis yang konsisten untuk atribut. Beberapa atribut yang umumnya berlaku mencakup:
srcs:label_list, yang memungkinkan file: file sumber, biasanya ditulis oleh manusia.deps:label_list, biasanya tidak memungkinkan file: dependensi kompilasi.data:label_list, yang memungkinkan file: file data, seperti data pengujian, dll.runtime_deps:label_list: dependensi runtime yang tidak diperlukan untuk kompilasi.
- Untuk atribut apa pun dengan perilaku yang tidak jelas (misalnya, template string dengan penggantian khusus, atau alat yang dipanggil dengan persyaratan tertentu), berikan dokumentasi menggunakan argumen kata kunci
docke deklarasi atribut (attr.label_list()atau yang serupa). - Fungsi penerapan aturan hampir selalu merupakan fungsi pribadi (diberi nama dengan garis bawah di awal). Gaya umum adalah memberi
fungsi penerapan untuk
myrulenama_myrule_impl. - Teruskan informasi antar-aturan Anda menggunakan antarmuka penyedia yang ditentukan dengan baik provider. Deklarasikan dan dokumentasikan kolom penyedia.
- Desain aturan Anda dengan mempertimbangkan kemampuan untuk diperluas. Pertimbangkan bahwa aturan lain mungkin ingin berinteraksi dengan aturan Anda, mengakses penyedia Anda, dan menggunakan kembali tindakan yang Anda buat.
- Ikuti panduan performa dalam aturan Anda.