アクションで、推移的な依存関係から蓄積された値を含む大きなコマンドラインが必要になることがよくあります。たとえば、リンカー コマンドラインで、リンク対象のすべてのライブラリに必要なすべてのオブジェクト ファイルをリストできます。このような推移的データを depset
に保存し、複数のターゲットで共有できるようにすることをおすすめします。ただし、ルール作成者がアクション コマンドラインを構築するために、これらのデプセットを文字列のリストに変換しなければならない場合、このメモリ共有の最適化は機能しなくなります。
このため、アクション構築関数は文字列に加えて Args
オブジェクトも受け入れます。各 Args
オブジェクトは、文字列と依存関係の連結を表します。データを操作するための変換は、任意で指定できます。Args
オブジェクトは、コマンドラインを計算する実行フェーズまで、カプセル化された依存関係を処理しません。これにより、分析フェーズが完了するまで、コストの高いコピーを延期できます。詳細については、パフォーマンスの最適化ページをご覧ください。
Args
は、ctx.actions.args()
を呼び出して作成されます。ctx.actions.run()
または ctx.actions.run_shell()
の arguments
パラメータとして渡すことができます。Args
オブジェクトの各ミューテーションは、最終的なコマンドラインに値を追加します。
map_each
機能を使用すると、アイテムを文字列に変換する方法をカスタマイズできます。map_each
関数を指定しない場合、標準の変換は次のようになります。
- すでに文字列になっている値はそのまま残ります。
File
オブジェクトはFile.path
値に変換されます。- 他のすべての型は、指定されていない方法で文字列に変換されます。このため、文字列型でも
File
型でもない値はadd()
に渡さず、add_all()
またはadd_joined()
に渡す場合はmap_each
関数を指定する必要があります。
文字列書式設定(add*()
メソッドの format
、format_each
、format_joined
パラメータ)を使用する場合、形式テンプレートは、文字列の %
置換と同じように解釈されます。ただし、テンプレートには置換プレースホルダが 1 つだけ必要で、%s
である必要があります。リテラルのパーセントは %%
としてエスケープできます。書式設定は、上記のように値が文字列に変換された後に適用されます。
各 add*()
メソッドには、追加の位置パラメータ、残りの引数の前に挿入する「引数名」の文字列を受け入れる代替形式があります。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], ... )
メンバー
add
Args Args.add(arg_name_or_value, value=unbound, *, format=None)このコマンドラインに引数を追加します。
パラメータ
パラメータ | 説明 |
---|---|
arg_name_or_value
|
必須 位置パラメータが 2 つ渡された場合、引数名として解釈されます。引数名は値の前に追加され、処理は行われません。渡された位置パラメータが 1 つだけの場合は、 value として解釈されます(下記参照)。 |
value
|
default = unbound 追加するオブジェクト。これは、上記の標準的な変換により文字列に変換されます。この関数には map_each パラメータがないため、value は文字列または File にする必要があります。リスト、タプル、depset、ディレクトリ File を、このメソッドの代わりに add_all() または add_joined() に渡す必要があります。
|
format
|
string; or None ;
default = Nonevalue の文字列化されたバージョンに適用される、書式設定文字列パターン。
|
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
|
sequence; or depset ;
default = unboundアイテムが追加されるリスト、タプル、または depset。 |
map_each
|
callable; or None ;
default = None各アイテムを 0 個以上の文字列に変換する関数です。文字列は追加前にさらに処理できます。このパラメータを指定しない場合は、標準の変換が使用されます。 この関数には、1 つまたは 2 つの位置引数が渡されます。つまり、変換する項目の後に、オプションの 戻り値の型は、そのアイテムに対して生成される引数の数によって異なります。
None を返すと、それぞれ長さ 1 または長さ 0 のリストを返すのと同じ効果があります。ただし、不要なリストを作成しないようにした方が効率的で読みやすくなります。通常、 大規模な分析フェーズのデータ構造が意図せず実行フェーズに保持されるのを避けるため、トップレベルの 警告: |
format_each
|
string; or None ;
default = Nonemap_each 関数によって返される各文字列に適用される、省略可能な書式設定文字列パターン。形式設定文字列には、「%s」プレースホルダを 1 つだけ含める必要があります。
|
before_each
|
string; or None ;
default = Nonevalues から派生した各引数が追加される前に追加するオプションの文字列。
|
omit_if_empty
|
default = True true の場合、追加する values から派生した引数がない場合、以降の処理はすべて行われず、コマンドラインは変更されません。false の場合、引数名と terminate_with (指定されている場合)は、他の引数の有無にかかわらず追加されます。 |
uniquify
|
default = False true の場合、 values から派生した重複する引数は省略されます。各引数の最初の出現だけが残ります。depset ではすでに重複が省略されているため、通常この機能は必要ありませんが、map_each が複数のアイテムに対して同じ文字列を出力する場合に便利です。 |
expand_directories
|
default = True true の場合、 values 内のすべてのディレクトリがファイルのフラットリストに展開されます。この処理は map_each が適用される前に行われます。 |
terminate_with
|
string; or None ;
default = None他のすべての引数の後に追加するオプションの文字列。 omit_if_empty が true(デフォルト)で、他のアイテムが追加されていない場合(values が空の場合、またはすべてのアイテムがフィルタされている場合)は、この文字列は追加されません。
|
allow_closure
|
default = 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(...)
の場合と同様に 1 つの引数に結合され、指定された format_joined
文字列テンプレートを使用してフォーマットされます。add_all()
とは異なり、before_each
パラメータや terminate_with
パラメータはありません。これらは通常、アイテムを 1 つの引数に結合する場合には有用ではないためです。
フィルタリング後に引数に結合する文字列がなく、omit_if_empty
が true(デフォルト)の場合、処理は行われません。結合する文字列がなく、omit_if_empty
が false の場合、結合される文字列は空の文字列になります。
パラメータ
パラメータ | 説明 |
---|---|
arg_name_or_values
|
必須 位置パラメータが 2 つ渡された場合、引数名として解釈されます。引数名は values の前に追加され、何も処理されません。omit_if_empty が true(デフォルト)で、結合する values から派生した文字列が存在しない場合、この引数は追加されません(values が空であるか、すべてのアイテムがフィルタされている場合)。渡された位置パラメータが 1 つだけの場合は、values として解釈されます(下記参照)。 |
values
|
sequence; or depset ;
default = unboundアイテムが結合されるリスト、タプル、または depset。 |
join_with
|
必須string.join() と同じ方法で、map_each と format_each を適用して取得した文字列を結合するために使用される区切り文字。 |
map_each
|
callable; or None ;
デフォルト = なしadd_all と同じです。
|
format_each
|
string; or None ;
デフォルト = なしadd_all と同じです。
|
format_joined
|
string; or None ;
default = None結合される文字列に適用されるオプションの形式文字列パターン。形式設定文字列には、「%s」プレースホルダを 1 つだけ含める必要があります。 |
omit_if_empty
|
default = True true の場合、結合する文字列がない場合( values が空であるか、すべてのアイテムがフィルタされているため)、それ以降の処理はすべて行われず、コマンドラインは変更されません。false に設定すると、結合する文字列がない場合でも 2 つの引数が追加されます。引数名の後に空の文字列(ゼロ文字列の論理結合)が続きます。
|
uniquify
|
default = Falseadd_all と同じです。
|
expand_directories
|
default = Trueadd_all と同じです。
|
allow_closure
|
default = Falseadd_all と同じです。
|
set_param_file_format
Args Args.set_param_file_format(format)パラメータ ファイルを使用する場合、その形式を設定します。
パラメータ
パラメータ | 説明 |
---|---|
format
|
必須 次のいずれかにする必要があります。
呼び出されない場合、形式はデフォルトで「shell」になります。 |
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)引数をパラメータ ファイルにオーバーフローし、パラメータ ファイルへのポインタに置き換えます。引数が大きすぎてシステムのコマンド長の制限を超えている可能性がある場合に使用します。
Bazel は、効率を高めるために、実行時に出力ツリーへのパラメータ ファイルの書き込みを省略することもできます。アクションをデバッグする際にパラメータ ファイルを検査する場合は、ビルドに --materialize_param_files
を渡します。
パラメータ
パラメータ | 説明 |
---|---|
param_file_arg
|
必須 1 つの「%s」を含む形式文字列。引数が params ファイルにオーバーフローした場合は、params ファイルのパスでフォーマットされたこの文字列で構成される引数に置き換えられます。 たとえば、引数がパラメータ ファイル「params.txt」にオーバーフローしている場合、「--file=%s」と指定すると、アクションのコマンドラインに「--file=params.txt」が含まれます。 |
use_always
|
default = False 引数を常にパラメータ ファイルにスピルするかどうか。false の場合、bazel は、システムと引数の長さに基づいて、引数をスピルする必要があるかどうかを判断します。 |