アクションには、推移的な依存関係から累積された値を含む長いコマンドラインが必要になることがよくあります。たとえば、リンカーのコマンドラインには、リンクされるすべてのライブラリに必要なすべてのオブジェクト ファイルがリストされることがあります。このような推移的なデータは depset に保存して、複数のターゲットで共有できるようにすることをおすすめします。ただし、ルール作成者がアクション コマンドラインを構築するためにこれらの depset を文字列のリストに変換する必要がある場合、このメモリ共有の最適化は無効になります。
このため、アクション構築関数は文字列に加えて Args オブジェクトを受け入れます。各 Args オブジェクトは、文字列と depset の連結を表し、データを操作するためのオプションの変換が含まれています。Args オブジェクトは、コマンドラインを計算する実行フェーズまで、カプセル化された depset を処理しません。これにより、分析フェーズが完了するまで、コストのかかるコピーを延期できます。詳細については、パフォーマンスの最適化ページをご覧ください。
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関数を指定する必要があります。
文字列のフォーマット(format、format_each、および format_joined パラメータ)を使用する場合、フォーマット テンプレートは文字列の % 置換と同じように解釈されます。ただし、テンプレートには 1 つの置換プレースホルダがあり、%s である必要があります。add*()リテラルのパーセント記号は %% としてエスケープできます。フォーマットは、上記のように値が文字列に変換された後に適用されます。
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],
...
)
メンバー
追加
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(デフォルト)の場合を除き、arg 名とterminate_withが指定されている場合は、それぞれ最初と最後の引数として挿入されます。
パラメータ
| パラメータ | 説明 |
|---|---|
arg_name_or_values
|
必須 2 つの位置パラメータが渡された場合、これは引数名として解釈されます。引数名は、処理なしで別の引数として values の前に追加されます。omit_if_empty が true(デフォルト)で、他のアイテムが追加されていない場合(values が空の場合や、すべてのアイテムがフィルタされている場合など)、この引数名は追加されません。位置パラメータが 1 つだけ渡された場合は、values(下記)として解釈されます。
|
values
|
シーケンス、または depset。
デフォルトは unboundアイテムが追加されるリスト、タプル、または depset。 |
map_each
|
呼び出し可能、または None。
デフォルトは None。各アイテムを 0 個以上の文字列に変換する関数。追加する前にさらに処理できます。このパラメータが指定されていない場合は、標準変換が使用されます。 関数には、変換するアイテムと、オプションの 戻り値の型は、アイテムに対して生成される引数の数によって異なります。
None を返すことは、それぞれ長さ 1 または長さ 0 のリストを返すのと同じ効果があります。ただし、不要なリストを作成しない方が効率的で読みやすくなります。通常、ディレクトリであるアイテムは、 分析フェーズの大きなデータ構造が実行フェーズに意図せず保持されないようにするには、 警告: |
format_each
|
文字列、または None。
デフォルトは None`map_each` 関数から返される各文字列に適用されるオプションのフォーマット文字列パターン。 map_eachフォーマット文字列には、1 つの '%s' プレースホルダが必要です。
|
before_each
|
文字列、または None。デフォルトは Nonevalues から派生した各引数の前に追加するオプションの引数。
|
omit_if_empty
|
ブール値。
デフォルトは Truetrue の場合、追加する values から派生した引数がない場合、以降の処理はすべて抑制され、コマンドラインは変更されません。false の場合、他の引数があるかどうかに関係なく、arg 名と terminate_with が指定されている場合は追加されます。
|
uniquify
|
ブール値。
デフォルトは Falsetrue の場合、 values から派生した重複する引数は省略されます。各引数の最初の出現のみが残ります。通常、depset は重複を省略するため、この機能は必要ありませんが、map_each が複数のアイテムに対して同じ文字列を出力する場合は便利です。
|
expand_directories
|
ブール値。
デフォルトは Truetrue の場合、 values 内のディレクトリはファイルのフラット リストに展開されます。これは map_each が適用される前に行われます。
|
terminate_with
|
文字列、または None。
デフォルトは None他のすべての引数の後に追加するオプションの引数。 omit_if_empty が true(デフォルト)で、他のアイテムが追加されていない場合(values が空の場合や、すべてのアイテムがフィルタされている場合など)、この引数は追加されません。
|
allow_closure
|
ブール値。
デフォルトは Falsetrue の場合、 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() とは異なり、アイテムが 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
|
シーケンス、または depset。
デフォルトは unbound。 アイテムが結合されるリスト、タプル、または depset。 |
join_with
|
文字列。
必須map_each と format_each の適用によって取得された文字列を、string.join() と同様に結合するために使用される区切り文字。
|
map_each
|
呼び出し可能、または None。
デフォルトは Noneadd_all と同じ。
|
format_each
|
文字列、または None。
デフォルトは Noneadd_all と同じ。
|
format_joined
|
文字列、または None。
デフォルトは None。結合された文字列に適用されるオプションのフォーマット文字列パターン。フォーマット文字列には、1 つの '%s' プレースホルダが必要です。 |
omit_if_empty
|
ブール値;
デフォルトは Truetrue の場合、結合する文字列がない場合( values が空の場合や、すべてのアイテムがフィルタされている場合など)、以降の処理はすべて抑制され、コマンドラインは変更されません。false の場合、結合する文字列がない場合でも、2 つの引数が追加されます。arg 名の後に空の文字列が続きます(これは 0 個の文字列の論理結合です)。
|
uniquify
|
ブール値。
デフォルトは False` add_all` と同じ。
|
expand_directories
|
ブール値。
デフォルトは True`add_all` add_allと同じ。
|
allow_closure
|
ブール値。
デフォルトは False` add_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.txt」にスピルされる場合、「--file=%s」を指定すると、アクション コマンドラインに「--file=params.txt」が含まれます。 |
use_always
|
ブール値。
デフォルトは False引数を常にパラメータ ファイルにスピルするかどうか。false の場合、引数をスピルする必要があるかどうかは、システムと引数の長さに基づいて bazel が決定します。 |