Men-deploy Aturan

Laporkan masalah Lihat sumber Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Halaman ini ditujukan bagi penulis aturan yang berencana membuat aturan mereka tersedia bagi orang lain.

Sebaiknya mulai set aturan baru dari repositori template: https://github.com/bazel-contrib/rules-template Template tersebut mengikuti rekomendasi di bawah, dan mencakup pembuatan dokumentasi API serta menyiapkan pipeline CI/CD agar distribusi set aturan Anda menjadi mudah.

Aturan hosting dan penamaan

Aturan baru harus masuk ke repositori GitHub-nya sendiri di organisasi Anda. Mulai rangkaian pesan di GitHub jika Anda merasa aturan Anda termasuk dalam organisasi bazelbuild.

Nama repositori untuk aturan Bazel distandardisasi dalam format berikut: $ORGANIZATION/rules_$NAME. Lihat contoh di GitHub. Untuk konsistensi, Anda harus mengikuti format yang sama saat memublikasikan aturan Bazel.

Pastikan untuk menggunakan deskripsi dan judul repositori GitHub yang deskriptif, contoh:README.md

  • Nama repositori: bazelbuild/rules_go
  • Deskripsi repositori: Aturan Go untuk Bazel
  • Tag repositori: golang, bazel
  • header README.md: Aturan Go untuk Bazel (perhatikan link ke https://bazel.build yang akan memandu pengguna yang belum mengenal Bazel ke tempat yang tepat)

Aturan dapat dikelompokkan berdasarkan bahasa (seperti Scala), platform runtime (seperti Android), atau framework (seperti Spring).

Konten repositori

Setiap repositori aturan harus memiliki tata letak tertentu agar pengguna dapat dengan cepat memahami aturan baru.

Misalnya, saat menulis aturan baru untuk bahasa mockascript (fiktif), repositori aturan akan memiliki struktur berikut:

/
  LICENSE
  README
  MODULE.bazel
  mockascript/
    constraints/
      BUILD
    runfiles/
      BUILD
      runfiles.mocs
    BUILD
    defs.bzl
  tests/
    BUILD
    some_test.sh
    another_test.py
  examples/
    BUILD
    bin.mocs
    lib.mocs
    test.mocs

MODULE.bazel

Di MODULE.bazel project, Anda harus menentukan nama yang akan digunakan pengguna untuk merujuk ke aturan Anda. Jika aturan Anda termasuk dalam organisasi bazelbuild, Anda harus menggunakan rules_<lang> (seperti rules_mockascript). Jika tidak, Anda harus memberi nama repositori Anda <org>_rules_<lang> (seperti build_stack_rules_proto). Mulai percakapan di GitHub jika Anda merasa aturan Anda harus mengikuti konvensi untuk aturan dalam organisasi bazelbuild.

Di bagian berikut, asumsikan bahwa repositori tersebut adalah milik organisasi bazelbuild.

module(name = "rules_mockascript")

README

Di tingkat teratas, harus ada README yang berisi deskripsi singkat tentang set aturan Anda, dan yang diharapkan oleh pengguna API.

Aturan

Sering kali ada beberapa aturan yang disediakan oleh repositori Anda. Buat direktori yang dinamai berdasarkan bahasa dan berikan titik entri - file defs.bzl yang mengekspor semua aturan (sertakan juga file BUILD agar direktori menjadi paket). Untuk rules_mockascript, artinya akan ada direktori bernama mockascript, serta file BUILD dan file defs.bzl di dalamnya:

/
  mockascript/
    BUILD
    defs.bzl

Batasan

Jika aturan Anda menentukan aturan toolchain, Anda mungkin perlu menentukan constraint_setting dan/atau constraint_value kustom. Masukkan ini ke dalam paket //<LANG>/constraints. Struktur direktori Anda akan terlihat seperti ini:

/
  mockascript/
    constraints/
      BUILD
    BUILD
    defs.bzl

Baca github.com/bazelbuild/platforms untuk mengetahui praktik terbaik, dan untuk melihat batasan yang sudah ada, serta pertimbangkan untuk menyumbangkan batasan Anda di sana jika batasan tersebut tidak bergantung pada bahasa. Berhati-hatilah saat memperkenalkan batasan kustom, semua pengguna aturan Anda akan menggunakannya untuk melakukan logika khusus platform dalam file BUILD mereka (misalnya, menggunakan select). Dengan batasan kustom, Anda menentukan bahasa yang akan digunakan oleh seluruh ekosistem Bazel.

Library runfile

Jika aturan Anda menyediakan library standar untuk mengakses runfile, aturan tersebut harus berupa target library yang terletak di //<LANG>/runfiles (singkatan dari //<LANG>/runfiles:runfiles). Target pengguna yang perlu mengakses dependensi data mereka biasanya akan menambahkan target ini ke atribut deps mereka.

Aturan repositori

Dependensi

Aturan Anda mungkin memiliki dependensi eksternal, yang harus Anda tentukan dalam file MODULE.bazel.

Mendaftarkan toolchain

Aturan Anda juga dapat mendaftarkan toolchain, yang juga dapat Anda tentukan dalam file MODULE.bazel.

Perhatikan bahwa untuk menyelesaikan toolchain dalam fase analisis, Bazel perlu menganalisis semua target toolchain yang terdaftar. Bazel tidak perlu menganalisis semua target yang dirujuk oleh atribut toolchain.toolchain. Jika untuk mendaftarkan toolchain, Anda perlu melakukan komputasi yang kompleks di repositori, sebaiknya pisahkan repositori dengan target toolchain dari repositori dengan target <LANG>_toolchain. Former akan selalu diambil, dan latter hanya akan diambil saat pengguna benar-benar perlu membuat kode <LANG>.

Cuplikan rilis

Dalam pengumuman rilis, berikan cuplikan yang dapat disalin dan ditempel pengguna ke dalam file MODULE.bazel mereka. Cuplikan ini secara umum akan terlihat sebagai berikut:

bazel_dep(name = "rules_<LANG>", version = "<VERSION>")

Pengujian

Harus ada pengujian yang memverifikasi bahwa aturan berfungsi seperti yang diharapkan. File ini dapat berada di lokasi standar untuk bahasa yang digunakan dalam aturan atau di direktori tests/ di tingkat teratas.

Contoh (opsional)

Pengguna akan merasa terbantu dengan adanya direktori examples/ yang menunjukkan beberapa cara dasar penggunaan aturan.

CI/CD

Banyak set aturan menggunakan GitHub Actions. Lihat konfigurasi yang digunakan di repo rules-template, yang disederhanakan menggunakan "alur kerja yang dapat digunakan kembali" yang dihosting di org bazel-contrib. ci.yaml menjalankan pengujian pada setiap PR dan commit main, dan release.yaml berjalan setiap kali Anda mengirim tag ke repositori. Lihat komentar di repositori rules-template untuk mengetahui informasi selengkapnya.

Jika repositori Anda berada di bawah organisasi bazelbuild, Anda dapat meminta untuk menambahkannya ke ci.bazel.build.

Dokumentasi

Lihat dokumentasi Stardoc untuk mengetahui petunjuk cara memberi komentar pada aturan Anda agar dokumentasi dapat dibuat secara otomatis.

Folder rules-template docs/ menunjukkan cara sederhana untuk memastikan konten Markdown di folder docs/ selalu terbaru saat file Starlark diperbarui.

FAQ

Mengapa kita tidak dapat menambahkan aturan ke repositori GitHub Bazel utama?

Kami ingin memisahkan aturan dari rilis Bazel sebanyak mungkin. Hal ini memperjelas siapa yang memiliki setiap aturan, sehingga mengurangi beban pada developer Bazel. Bagi pengguna kami, pemisahan memudahkan modifikasi, upgrade, downgrade, dan penggantian aturan. Berkontribusi pada aturan dapat lebih ringan daripada berkontribusi pada Bazel - bergantung pada aturan -, termasuk akses pengiriman penuh ke repositori GitHub yang sesuai. Mendapatkan akses pengiriman ke Bazel itu sendiri adalah proses yang jauh lebih rumit.

Kekurangannya adalah proses penginstalan satu kali yang lebih rumit bagi pengguna kami: mereka harus menambahkan dependensi pada set aturan Anda di file MODULE.bazel mereka.

Dulu kami memiliki semua aturan di repositori Bazel (di bawah //tools/build_rules atau //tools/build_defs). Kami masih memiliki beberapa aturan di sana, tetapi kami sedang berupaya memindahkan aturan yang tersisa.