コマンドラインの一部またはすべてを構築するために必要なデータをメモリ効率の良い方法でカプセル化するオブジェクト。
多くの場合、アクションには、推移的依存関係から蓄積された値を含む大きなコマンドラインが必要です。たとえば、リンカーのコマンドラインには、リンクされているすべてのライブラリで必要なすべてのオブジェクト ファイルがリストされている場合があります。このような推移的なデータは、複数のターゲットで共有できるように、depset
に保存することをおすすめします。ただし、ルール作成者がアクションのコマンドラインを構築するためにこれらの depsets を文字列のリストに変換する必要がある場合、このメモリ共有の最適化は無効になります。
そのため、アクション構築関数は文字列に加えて Args
オブジェクトも受け入れます。各 Args
オブジェクトは、文字列と depsets の連結を表します。データ操作用の変換は省略可能です。Args
オブジェクトは、コマンドラインを計算する実行フェーズまで、カプセル化された depsets を処理しません。これにより、分析フェーズが完了するまで高コストのコピーを延期できます。詳細については、パフォーマンスの最適化ページをご覧ください。
Args
は、ctx.actions.args()
を呼び出して作成します。これらは、ctx.actions.run()
または ctx.actions.run_shell()
の arguments
パラメータとして渡すことができます。Args
オブジェクトの各ミューテーションは、最終的なコマンドラインに値を追加します。
map_each
機能を使用すると、アイテムを文字列に変換する方法をカスタマイズできます。map_each
関数を指定しない場合、標準の変換は次のようになります。
- すでに文字列である値はそのまま残されます。
File
オブジェクトはFile.path
値に変換されます。Label
オブジェクトは、メイン リポジトリのコンテキストで解決されると、同じオブジェクトに解決される文字列表現に変換されます。可能であれば、文字列表現ではリポジトリの正規名ではなくリポジトリの表示名が使用されます。これにより、この表現は BUILD ファイルでの使用に適したものになります。表現の正確な形式は保証されませんが、一般的な例としては//foo:bar
、@repo//foo:bar
、@@canonical_name+//foo:bar.bzl
などがあります。- 他のすべての型は、指定されていない方法で文字列に変換されます。そのため、文字列型または
File
型以外の値をadd()
に渡すことは避ける必要があります。add_all()
またはadd_joined()
に渡す場合は、map_each
関数を指定する必要があります。
文字列の書式設定(add*()
メソッドの format
、format_each
、format_joined
パラメータ)を使用する場合、書式設定テンプレートは文字列の %
置換と同じ方法で解釈されます。ただし、テンプレートには置換プレースホルダが 1 つだけ含まれており、それは %s
である必要があります。リテラル パーセントは %%
としてエスケープできます。上記のとおり、値が文字列に変換された後に書式設定が適用されます。
add*()
メソッドにはそれぞれ、追加の位置パラメータを受け取る代替形式があります。これは、残りの引数の前に挿入する「arg name」文字列です。add_all
と add_joined
の場合、シーケンスが空になると、追加の文字列は追加されません。たとえば、同じ使用方法でも、指定されたシーケンスに val1..val3
が含まれているか空であるかに応じて、--foo val1 val2 val3 --bar
または --bar
のみがコマンドラインに追加されることがあります。
コマンドラインのサイズがシステムで許容される最大サイズを超える場合は、引数をパラメータ ファイルにスピルオーバーできます。use_param_file()
と set_param_file_format()
をご覧ください。
例: 次のコマンドラインを生成するとします。
--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
Args
オブジェクトを使用できます。# 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], ... )
メンバー
追加
Args Args.add(arg_name_or_value, value=unbound, *, format=None)
パラメータ
パラメータ | 説明 |
---|---|
arg_name_or_value
|
必須 2 つの位置パラメータが渡された場合、これは引数名として解釈されます。引数名は、処理なしで値の前に追加されます。位置パラメータが 1 つだけ渡された場合は、 value として解釈されます(下記を参照)。 |
value
|
デフォルトは unbound です。追加するオブジェクト。上記の標準変換を使用して文字列に変換されます。この関数には map_each パラメータがないため、value は文字列または File のいずれかである必要があります。このメソッドの代わりに、リスト、タプル、depset、またはディレクトリ File を add_all() または add_joined() に渡す必要があります。 |
format
|
文字列、または None 。デフォルトは None です。 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)
処理のほとんどは、次の手順に沿って、追加される引数のリストに対して行われます。
- 各ディレクトリ
File
項目は、そのディレクトリに再帰的に含まれるすべてのFile
に置き換えられます。 map_each
が指定されている場合は、各項目に適用され、結果の文字列リストが連結されて最初の引数リストが形成されます。それ以外の場合、初期引数リストは、各項目に標準変換を適用した結果です。- リスト内の各引数は、存在する場合は
format_each
でフォーマットされます。 uniquify
が true の場合、重複する引数は削除されます。最初に出現したものが残ります。before_each
文字列が指定されている場合は、リスト内の既存の各引数の前に新しい引数として挿入されます。これにより、この時点で追加される引数の数が事実上 2 倍になります。- リストが空で
omit_if_empty
が true(デフォルト)の場合を除き、引数名とterminate_with
が指定されている場合は、それぞれ最初と最後の引数として挿入されます。
パラメータ
パラメータ | 説明 |
---|---|
arg_name_or_values
|
必須 2 つの位置パラメータが渡された場合、これは引数名として解釈されます。引数名は、処理なしで別の引数として values の前に追加されます。omit_if_empty が true(デフォルト)で、他のアイテムが追加されていない場合(values が空の場合や、すべてのアイテムがフィルタリングされた場合など)、この引数名は追加されません。位置パラメータが 1 つだけ渡された場合は、values として解釈されます(下記を参照)。 |
values
|
シーケンス、または depset。デフォルトは unbound です。 アイテムが追加されるリスト、タプル、または depset。 |
map_each
|
呼び出し可能オブジェクト、または None 。デフォルトは None です。 各項目を 0 個以上の文字列に変換する関数。文字列は、追加される前にさらに処理されることがあります。このパラメータを指定しない場合、標準の変換が使用されます。 この関数には、1 つまたは 2 つの位置引数が渡されます。変換するアイテムと、オプションの 戻り値の型は、アイテムに対して生成される引数の数によって異なります。
None を返すことは、それぞれ長さ 1 または長さ 0 のリストを返すことと同じ効果があります。ただし、リストが不要な場合は、リストを作成しない方が効率的で読みやすくなります。通常、 分析フェーズの大きなデータ構造が実行フェーズに意図せず保持されるのを防ぐため、 警告: |
format_each
|
文字列、または None 。デフォルトは None です。 map_each 関数から返される各文字列に適用される、省略可能な書式文字列パターン。フォーマット文字列には「%s」プレースホルダが 1 つだけ含まれている必要があります。 |
before_each
|
string、または None 。デフォルトは None です。 values から派生した各引数の前に付加するオプションの引数。 |
omit_if_empty
|
bool;
デフォルトは True true の場合、 values から派生した引数が追加されない場合、それ以降の処理はすべて抑制され、コマンドラインは変更されません。false の場合、他の引数の有無にかかわらず、引数名と terminate_with (指定されている場合)は追加されます。 |
uniquify
|
bool;
デフォルトは False true の場合、 values から派生した重複する引数は省略されます。各引数の最初の出現のみが残ります。通常、この機能は必要ありません。depsets はすでに重複を省略しているためです。ただし、map_each が複数のアイテムに対して同じ文字列を出力する場合は、この機能が役立ちます。 |
expand_directories
|
bool;
デフォルトは True true の場合、 values 内のディレクトリはファイルのフラット リストに展開されます。これは map_each が適用される前に行われます。 |
terminate_with
|
string、または None 。デフォルトは None です。 他のすべての引数の後に付加するオプションの引数。 omit_if_empty が true(デフォルト)で、他のアイテムが追加されていない場合(values が空の場合や、そのアイテムがすべてフィルタされている場合など)、この引数は追加されません。 |
allow_closure
|
bool; デフォルトは False true の場合、 map_each などの関数パラメータでクロージャを使用できます。通常、これは必要ありません。また、分析フェーズの大きなデータ構造が実行フェーズに保持されるリスクがあります。 |
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)
処理は add_all()
と似ていますが、values
から派生した引数のリストは join_with.join(...)
のように単一の引数に結合され、指定された format_joined
文字列テンプレートを使用してフォーマットされます。add_all()
とは異なり、アイテムが 1 つの引数に結合される場合は通常有用ではないため、before_each
パラメータや terminate_with
パラメータはありません。
フィルタリング後に引数に結合する文字列がなく、omit_if_empty
が true(デフォルト)の場合、処理は行われません。それ以外の場合、結合する文字列がなく、omit_if_empty
が false の場合、結合された文字列は空の文字列になります。
パラメータ
パラメータ | 説明 |
---|---|
arg_name_or_values
|
必須 2 つの位置パラメータが渡された場合、これは引数名として解釈されます。引数名は、処理なしで values の前に追加されます。omit_if_empty が true(デフォルト)で、values から派生した結合する文字列がない場合(values が空の場合や、そのすべてのアイテムがフィルタされている場合など)、この引数は追加されません。位置パラメータが 1 つだけ渡された場合は、values として解釈されます(下記を参照)。 |
values
|
sequence、または depset。デフォルトは unbound です。 項目が結合されるリスト、タプル、または depset。 |
join_with
|
string;
必須string.join() と同様に、map_each と format_each の適用によって取得された文字列を結合するために使用される区切り文字。 |
map_each
|
呼び出し可能オブジェクト、または None 。デフォルトは None です。 add_all と同じです。 |
format_each
|
文字列、または None 。デフォルトは None です。 add_all と同じです。 |
format_joined
|
文字列。または None 。デフォルトは None です。 結合された文字列に適用される省略可能な書式文字列パターン。フォーマット文字列には「%s」プレースホルダが 1 つだけ含まれている必要があります。 |
omit_if_empty
|
bool; デフォルトは True true の場合、結合する文字列がない場合( values が空であるか、すべての項目がフィルタされている場合)、それ以降の処理はすべて抑制され、コマンドラインは変更されません。false の場合、結合する文字列がない場合でも、2 つの引数が追加されます。引数名の後に空の文字列(0 個の文字列の論理結合)が続きます。 |
uniquify
|
bool;
デフォルトは False add_all と同じです。 |
expand_directories
|
bool;
デフォルトは True add_all と同じです。 |
allow_closure
|
bool;
デフォルトは False add_all と同じです。 |
set_param_file_format
Args Args.set_param_file_format(format)
パラメータ
パラメータ | 説明 |
---|---|
format
|
string;
必須 次のいずれかである必要があります:
呼び出されない場合、形式はデフォルトで「shell」になります。 |
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)
Bazel は、効率を高めるために、実行中にパラメータ ファイルを出力ツリーに書き込むことを省略する場合があります。アクションをデバッグしてパラメータ ファイルを検査する場合は、ビルドに --materialize_param_files
を渡します。
パラメータ
パラメータ | 説明 |
---|---|
param_file_arg
|
string;
必須 単一の「%s」を含む形式文字列。引数がパラメータ ファイルにスピルされると、パラメータ ファイルのパスでフォーマットされたこの文字列で構成される引数に置き換えられます。 たとえば、引数が「params.txt」というパラメータ ファイルにスピルされる場合、「--file=%s」を指定すると、アクションのコマンドラインに「--file=params.txt」が含まれます。 |
use_always
|
bool;
デフォルトは False です。 引数を常にパラメータ ファイルにスピルするかどうか。false の場合、bazel はシステムと引数の長さに基づいて引数をスピルする必要があるかどうかを判断します。 |