Berikut adalah beberapa masalah dan pertanyaan umum terkait menulis ekstensi.
Mengapa file saya tidak dihasilkan / tindakan saya tidak pernah dijalankan?
Bazel hanya menjalankan tindakan yang diperlukan untuk membuat file output yang diminta.
Jika file yang diinginkan memiliki label, Anda dapat memintanya secara langsung:
bazel build //pkg:myfile.txt
Jika file tersebut berada dalam grup output target, Anda mungkin perlu menentukan grup output pada command line:
bazel build //pkg:mytarget --output_groups=foo
Jika Anda ingin {i>file <i}dibuat secara otomatis setiap kali target Anda yang disebutkan pada baris perintah, tambahkan ke {i> output<i} default aturan Anda dengan menampilkan penyedia
DefaultInfo
.
Lihat halaman Aturan untuk mengetahui informasi selengkapnya.
Mengapa fungsi implementasi saya tidak dijalankan?
Bazel hanya menganalisis target yang diminta untuk build. Anda seharusnya nama target pada baris perintah, atau sesuatu yang tergantung pada target.
File hilang ketika tindakan atau biner saya dieksekusi
Pastikan bahwa 1) file telah terdaftar sebagai input untuk tindakan atau biner, dan 2) skrip atau alat yang dieksekusi mengakses file menggunakan jalur yang benar.
Untuk tindakan, Anda mendeklarasikan input dengan meneruskannya ke fungsi ctx.actions.*
yang menghasilkan tindakan. Jalur yang tepat untuk file tersebut
dapat diperoleh menggunakan
File.path
Untuk biner (output yang dapat dieksekusi dijalankan oleh bazel run
atau bazel test
perintah), Anda mendeklarasikan input dengan menyertakannya dalam
runfiles. Daripada menggunakan kolom path
, gunakan
File.short_path
, yang merupakan jalur file yang terkait dengan
direktori {i>runfiles<i} tempat biner dieksekusi.
Bagaimana cara mengontrol file mana yang dibuat oleh bazel build //pkg:mytarget
?
Gunakan penyedia DefaultInfo
untuk
menetapkan output default.
Bagaimana cara menjalankan program atau melakukan I/O file sebagai bagian dari build saya?
Alat (tool) dapat dideklarasikan sebagai target, sama seperti bagian lain dari build Anda, dan
berjalan selama fase eksekusi untuk
membantu membangun target lain. Untuk membuat tindakan
yang menjalankan alat, gunakan ctx.actions.run
dan teruskan
sebagai parameter executable
.
Selama fase pemuatan dan analisis, alat tidak dapat berjalan, Anda juga tidak dapat melakukannya I/O. Ini berarti bahwa alat dan isi file (kecuali konten BUILD dan .bzl) tidak dapat memengaruhi cara pembuatan grafik target dan tindakan.
Bagaimana jika saya perlu mengakses data terstruktur yang sama baik sebelum maupun selama fase eksekusi?
Anda dapat memformat data terstruktur sebagai file .bzl. Anda dapat load()
file untuk
mengaksesnya selama fase pemuatan dan analisis. Anda dapat meneruskannya
sebagai input atau
{i>runfile <i}ke tindakan dan {i>executables <i}
yang membutuhkannya selama fase eksekusi.
Bagaimana cara mendokumentasikan kode Starlark?
Untuk aturan dan atribut aturan, Anda bisa meneruskan literal docstring (mungkin
tanda kutip tiga kali) ke parameter doc
dari rule
atau attr.*()
. Untuk asisten
fungsi dan makro, gunakan literal docstring tiga tanda kutip mengikuti format
yang diberikan di sini.
Fungsi implementasi aturan umumnya tidak memerlukan docstring-nya sendiri.
Menggunakan literal string di tempat yang diharapkan akan mempermudah proses otomatisasi alat untuk mengekstrak dokumentasi. Jangan ragu untuk menggunakan komentar non-string standar di mana pun hal itu dapat membantu pembaca kode Anda.