Sering kali tindakan memerlukan command line besar yang berisi nilai yang terakumulasi dari dependensi transitif. Misalnya, command line linker mungkin mencantumkan setiap file objek yang dibutuhkan oleh semua library yang ditautkan. Praktik terbaiknya adalah menyimpan data transitif tersebut dalam depset
, sehingga data tersebut dapat dibagikan oleh beberapa target. Namun, jika pembuat aturan harus mengonversi dependensi ini menjadi daftar string untuk membuat command line tindakan, tindakan tersebut akan mengalahkan pengoptimalan berbagi memori ini.
Karena alasan ini, fungsi pembuatan tindakan menerima objek Args
selain string. Setiap objek Args
mewakili penyambungan string dan dependensi, dengan transformasi opsional untuk memanipulasi data. Objek Args
tidak memproses dependensi yang dienkapsulasi hingga fase eksekusi, ketika tiba waktunya untuk menghitung command line. Langkah ini dapat menunda penyalinan yang mahal hingga fase analisis selesai. Lihat halaman Mengoptimalkan Performa untuk informasi selengkapnya.
Args
dibuat dengan memanggil ctx.actions.args()
. Parameter ini dapat diteruskan sebagai parameter arguments
dari ctx.actions.run()
atau ctx.actions.run_shell()
. Setiap mutasi objek Args
menambahkan nilai ke command line.
Fitur map_each
memungkinkan Anda menyesuaikan cara item diubah menjadi string. Jika Anda tidak memberikan fungsi map_each
, konversi standarnya adalah sebagai berikut:
- Nilai yang sudah menjadi string akan dibiarkan apa adanya.
- Objek
File
diubah menjadi nilaiFile.path
-nya. - Semua jenis lain diubah menjadi string dengan cara yang tidak ditentukan. Oleh karena itu, Anda harus menghindari penerusan nilai yang bukan dari jenis string atau
File
keadd()
, dan jika Anda meneruskannya keadd_all()
atauadd_joined()
, Anda harus menyediakan fungsimap_each
.
Saat menggunakan pemformatan string (parameter format
, format_each
, dan format_joined
dari metode add*()
), template format ditafsirkan dengan cara yang sama seperti substitusi %
pada string, kecuali bahwa template harus memiliki tepat satu placeholder substitusi dan harus berupa %s
. Persentase literal dapat di-escape sebagai %%
. Pemformatan diterapkan setelah nilai dikonversi ke string seperti yang dijelaskan di atas.
Setiap metode add*()
memiliki bentuk alternatif yang menerima parameter posisi tambahan, yaitu string "arg name" yang akan disisipkan sebelum argumen lainnya. Untuk add_all
dan add_joined
, string tambahan tidak akan ditambahkan jika urutan ternyata kosong. Misalnya, penggunaan yang sama dapat menambahkan --foo val1 val2 val3 --bar
atau hanya --bar
ke command line, bergantung pada apakah urutan yang diberikan berisi val1..val3
atau kosong.
Jika ukuran command line dapat bertambah lebih panjang dari ukuran maksimum yang diizinkan oleh sistem, argumen dapat dituangkan ke dalam file parameter. Lihat use_param_file()
dan set_param_file_format()
.
Contoh: Misalkan kita ingin membuat command line:
--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --bazKita dapat menggunakan objek
Args
berikut: # foo_deps and bar_deps are depsets containing # File objects for the foo and bar .txt files. args = ctx.actions.args() args.add_all("--foo", foo_deps) args.add_joined("--bar", bar_deps, join_with=",") args.add("--baz") ctx.actions.run( ... arguments = [args], ... )
Pelanggan
add
Args Args.add(arg_name_or_value, value=unbound, *, format=None)Menambahkan argumen ke command line ini.
Parameter
Parameter | Deskripsi |
---|---|
arg_name_or_value
|
diperlukan Jika dua parameter posisi diteruskan, ini akan ditafsirkan sebagai nama arg. Nama argumen ditambahkan sebelum nilai tanpa pemrosesan apa pun. Jika hanya satu parameter posisi yang diteruskan, parameter tersebut akan ditafsirkan sebagai value (lihat di bawah).
|
value
|
default = tidak terikat Objek yang akan ditambahkan. Kolom ini akan dikonversi menjadi string menggunakan konversi standar yang disebutkan di atas. Karena tidak ada parameter map_each untuk fungsi ini, value harus berupa string atau File . Daftar, tuple, depset, atau direktori File harus diteruskan ke add_all() atau add_joined() , bukan metode ini.
|
format
|
string; or None ;
default = Tidak adaPola string format, yang akan diterapkan ke versi string value .
|
add_all
Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)Menambahkan beberapa argumen ke command line ini. Item diproses dengan lambat selama fase eksekusi.
Sebagian besar pemrosesan terjadi melalui daftar argumen yang akan ditambahkan, sesuai dengan langkah-langkah berikut:
- Setiap item direktori
File
diganti dengan semuaFile
secara berulang yang terdapat dalam direktori tersebut. - Jika
map_each
diberikan, kode ini akan diterapkan ke setiap item, dan daftar string yang dihasilkan akan digabungkan untuk membentuk daftar argumen awal. Jika tidak, daftar argumen awal adalah hasil dari penerapan konversi standar untuk setiap item. - Setiap argumen dalam daftar diformat dengan
format_each
, jika ada. - Jika
uniquify
bernilai benar, argumen duplikat akan dihapus. Kejadian pertama adalah kejadian yang tersisa. - Jika diberikan, string
before_each
akan disisipkan sebagai argumen baru sebelum setiap argumen yang ada dalam daftar. Hal ini secara efektif menggandakan jumlah argumen yang akan ditambahkan oleh titik ini. - Kecuali jika daftar kosong dan
omit_if_empty
bernilai benar (default), nama arg danterminate_with
masing-masing akan disisipkan sebagai argumen pertama dan terakhir, jika diberikan.
Parameter
Parameter | Deskripsi |
---|---|
arg_name_or_values
|
diperlukan Jika dua parameter posisi diteruskan, ini akan ditafsirkan sebagai nama arg. Nama argumen ditambahkan sebelum values tanpa pemrosesan apa pun. Nama argumen ini tidak akan ditambahkan jika omit_if_empty bernilai benar (default) dan tidak ada item lain yang ditambahkan (seperti yang terjadi jika values kosong atau semua itemnya difilter). Jika hanya satu parameter posisi yang diteruskan, parameter tersebut akan ditafsirkan sebagai values (lihat di bawah).
|
values
|
sequence; or depset ;
default = tidak terikatDaftar, tuple, atau depset yang itemnya akan ditambahkan. |
map_each
|
callable; or None ;
default = Tidak adaFungsi yang mengonversi setiap item menjadi nol atau beberapa string, yang dapat diproses lebih lanjut sebelum ditambahkan. Jika parameter ini tidak diberikan, konversi standar akan digunakan. Fungsi ini diteruskan dengan satu atau dua argumen posisi: item yang akan dikonversi, diikuti dengan Jenis nilai yang ditampilkan bergantung pada jumlah argumen yang akan dihasilkan untuk item:
None memiliki efek yang sama dengan menampilkan daftar dengan panjang 1 atau panjang 0 masing-masing. Namun, akan lebih efisien dan mudah dibaca untuk menghindari pembuatan daftar yang tidak diperlukan.Biasanya, item yang merupakan direktori otomatis diperluas ke kontennya saat Untuk menghindari retensi yang tidak diinginkan dari struktur data fase analisis yang besar ke fase eksekusi, fungsi Peringatan: Pernyataan |
format_each
|
string; or None ;
default = NonePola string format opsional, diterapkan ke setiap string yang ditampilkan oleh fungsi map_each . String format harus memiliki tepat satu placeholder '%s'.
|
before_each
|
string; or None ;
default = NoneString opsional yang akan ditambahkan sebelum setiap argumen yang berasal dari values ditambahkan.
|
omit_if_empty
|
default = True Jika true, jika tidak ada argumen yang berasal dari values yang akan ditambahkan, semua pemrosesan lebih lanjut akan disembunyikan dan command line tidak akan berubah. Jika salah (false), nama arg dan terminate_with , jika disediakan, akan tetap ditambahkan, terlepas dari apakah ada argumen lain atau tidak.
|
uniquify
|
default = False Jika benar, argumen duplikat yang berasal dari values akan dihilangkan. Hanya kemunculan pertama setiap argumen yang akan tetap ada. Biasanya fitur ini tidak diperlukan karena dependensi sudah menghilangkan duplikat, tetapi dapat berguna jika map_each memunculkan string yang sama untuk beberapa item.
|
expand_directories
|
default = True Jika true (benar), direktori apa pun di values akan diperluas ke daftar file datar. Hal ini terjadi sebelum map_each diterapkan.
|
terminate_with
|
string; or None ;
default = NoneString opsional yang akan ditambahkan setelah semua argumen lainnya. String ini tidak akan ditambahkan jika omit_if_empty bernilai benar (default) dan tidak ada item lain yang ditambahkan (seperti yang terjadi jika values kosong atau semua itemnya difilter).
|
allow_closure
|
default = False Jika true (benar), izinkan penggunaan close-up dalam parameter fungsi seperti map_each . Biasanya hal ini tidak diperlukan dan berisiko mempertahankan struktur data fase analisis yang besar ke dalam fase eksekusi.
|
add_joined
Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)Menambahkan argumen ke command line ini dengan menggabungkan beberapa nilai menggunakan pemisah. Item diproses dengan lambat selama fase eksekusi.
Pemrosesannya mirip dengan add_all()
, tetapi daftar argumen yang berasal dari values
digabungkan menjadi satu argumen seolah-olah oleh join_with.join(...)
, lalu diformat menggunakan template string format_joined
yang diberikan. Tidak seperti add_all()
, tidak ada parameter before_each
atau terminate_with
karena parameter tersebut umumnya tidak berguna saat item digabungkan menjadi satu argumen.
Jika setelah pemfilteran tidak ada string untuk digabungkan ke dalam argumen, dan jika omit_if_empty
bernilai benar (default), tidak ada pemrosesan yang dilakukan. Atau, jika tidak ada string yang akan digabungkan, tetapi omit_if_empty
bernilai salah, string yang digabungkan akan berupa string kosong.
Parameter
Parameter | Deskripsi |
---|---|
arg_name_or_values
|
diperlukan Jika dua parameter posisi diteruskan, ini akan ditafsirkan sebagai nama arg. Nama argumen ditambahkan sebelum values tanpa pemrosesan apa pun. Argumen ini tidak akan ditambahkan jika omit_if_empty bernilai benar (default) dan tidak ada string yang berasal dari values untuk digabungkan (yang dapat terjadi jika values kosong atau semua itemnya difilter). Jika hanya satu parameter posisi yang diteruskan, parameter tersebut akan ditafsirkan sebagai values (lihat di bawah).
|
values
|
sequence; or depset ;
default = unboundDaftar, tuple, atau dependensi yang itemnya akan digabungkan. |
join_with
|
wajib String pembatas yang digunakan untuk menggabungkan string yang diperoleh dengan menerapkan map_each dan format_each , dengan cara yang sama seperti string.join() .
|
map_each
|
callable; or None ;
default = Tidak adaSama seperti untuk add_all .
|
format_each
|
string; or None ;
default = Tidak adaSama seperti untuk add_all .
|
format_joined
|
string; or None ;
default = NonePola string format opsional yang diterapkan ke string yang digabungkan. String format harus memiliki tepat satu placeholder '%s'. |
omit_if_empty
|
default = True Jika benar, jika tidak ada string yang akan digabungkan (karena values kosong atau semua itemnya difilter), semua pemrosesan lebih lanjut akan disembunyikan dan command line tidak akan berubah. Jika false, maka meskipun tidak ada string yang akan digabungkan, dua argumen akan ditambahkan: nama arg diikuti dengan string kosong (yang merupakan gabungan logis dari string nol).
|
uniquify
|
default = False Sama seperti untuk add_all .
|
expand_directories
|
default = Benar Sama seperti untuk add_all .
|
allow_closure
|
default = False Sama seperti untuk add_all .
|
set_param_file_format
Args Args.set_param_file_format(format)Menetapkan format file parameter, jika ada yang digunakan
Parameter
Parameter | Deskripsi |
---|---|
format
|
wajib Harus salah satu dari:
Secara default, formatnya adalah "shell" jika tidak dipanggil. |
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)Menumpahkan argumen ke file parameter, menggantinya dengan pointer ke file param. Gunakan saat argumen Anda mungkin terlalu besar untuk batas panjang perintah sistem.
Bazel dapat memilih untuk menghapus penulisan file parameter ke hierarki output selama eksekusi demi efisiensi. Jika Anda men-debug tindakan dan ingin memeriksa file parameter, teruskan --materialize_param_files
ke build Anda.
Parameter
Parameter | Deskripsi |
---|---|
param_file_arg
|
wajib String format dengan satu "%s". Jika argumen diteruskan ke file parameter, argumen tersebut akan diganti dengan argumen yang terdiri dari string yang diformat dengan jalur file params tersebut. Misalnya, jika args dituangkan ke file params "params.txt", menetapkan "--file=%s" akan menyebabkan command line tindakan berisi "--file=params.txt". |
use_always
|
default = False Apakah akan selalu menumpahkan argumen ke file parameter. Jika false, bazel akan memutuskan apakah argumen perlu ditambahkan berdasarkan sistem dan panjang arg Anda. |