Args

<ph type="x-smartling-placeholder"></ph> 問題を報告 ソースを表示 ナイトリー · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

コマンドラインの一部の構築または全体の構築に必要なデータを、メモリ効率的にカプセル化するオブジェクト。

多くの場合、アクションには、伝播依存関係から蓄積された値を含む大きなコマンドラインが必要になります。たとえば、リンカー コマンドラインには、リンクされるすべてのライブラリに必要なすべてのオブジェクト ファイルが一覧表示されます。このような伝播データを 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 値に変換されます。
  • 他のすべての型は、指定されていない方法で文字列に変換されます。このため、文字列型でも File 型でもない値を add() に渡すことは避ける必要があります。また、それらを add_all() または add_joined() に渡す場合は、map_each 関数を指定する必要があります。

文字列書式設定(add*() メソッドの formatformat_eachformat_joined パラメータ)を使用する場合、書式設定テンプレートは文字列の % 置換と同じように解釈されます。ただし、テンプレートには置換プレースホルダが 1 つだけで、%s である必要があります。リテラルの割合は、%% としてエスケープできます。書式設定は、上記のように値が文字列に変換された後に適用されます。

add*() メソッドには、追加の位置パラメータ(残りの引数の前に挿入する「引数名」文字列)を受け入れる代替形式があります。add_alladd_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)

このコマンドラインには複数の引数を追加します。アイテムは実行フェーズで遅延して処理されます。

処理の大部分は、次の手順に沿って追加される引数のリストに対して行われます。

  1. 各ディレクトリ File 項目は、そのディレクトリに再帰的に含まれるすべての File に置き換えられます。
  2. map_each が指定されている場合、それは各アイテムに適用され、結果の文字列リストが連結されて最初の引数リストが形成されます。それ以外の場合、最初の引数リストは、各項目に標準変換を適用した結果です。
  3. リスト内の各引数は、format_each の形式になります(存在する場合)。
  4. uniquify が true の場合、重複する引数が削除されます。最初の出現箇所が残っています。
  5. before_each 文字列が指定されている場合、リスト内の既存の引数の前に新しい引数として挿入されます。これにより、この時点で追加される引数の数は実質的に 2 倍になります。
  6. リストが空で、omit_if_empty が true(デフォルト)である場合を除き、引数名と terminate_with が指定されている場合は、それぞれ最初と最後の引数として挿入されます。
空の文字列は、これらのすべての処理ステップの対象となる有効な引数であることに注意してください。

パラメータ

パラメータ 説明
arg_name_or_values 必須
2 つの位置パラメータが渡された場合、これは引数名として解釈されます。引数名は、処理を行わずに values の前に別の引数として追加されます。omit_if_empty が true(デフォルト)で、他のアイテムが追加されていない場合(values が空の場合や、そのアイテムがすべてフィルタされている場合など)、この引数名は追加されません。渡される位置パラメータが 1 つだけの場合は、values と解釈されます(以下を参照)。
values sequence;または depset デフォルトは unbound
項目が追加されるリスト、タプル、または depset。
map_each callable;または None デフォルトは None
各項目を 0 個以上の文字列に変換する関数。文字列は付加する前にさらに処理できます。このパラメータを指定しない場合は、標準変換が使用されます。

この関数には、変換するアイテムと、オプションの DirectoryExpander の 1 つまたは 2 つの位置引数を渡します。2 番目の引数は、指定された関数が(組み込みではなく)ユーザー定義の関数で、複数のパラメータを宣言する場合にのみ渡されます。

戻り値の型は、そのアイテムに対して生成される引数の数によって異なります。

  • 各アイテムが 1 つの文字列に変わる一般的なケースでは、関数はその文字列を返します。
  • アイテムを完全に除外する場合は、関数は None を返す必要があります。
  • アイテムが複数の文字列に変わる場合、この関数はそれらの文字列のリストを返します。
単一の文字列または None を返すことは、それぞれ長さ 1 または長さ 0 のリストを返すのと同じ効果があります。ただし、リストが不要な場合は作成しないようにすると、効率的で読みやすくなります。

通常、ディレクトリのアイテムは、expand_directories=True が設定されると、自動的にそのコンテンツまで展開されます。ただし、他の値に含まれるディレクトリは展開されません。たとえば、アイテムがディレクトリをフィールドとして持つ構造体の場合です。この場合は、DirectoryExpander 引数を適用して、特定のディレクトリのファイルを手動で取得できます。

分析フェーズの大規模なデータ構造が実行フェーズに意図せず保持されないように、トップレベルの def ステートメントで map_each 関数を宣言する必要があります。デフォルトではネストされた関数のクロージャにすることはできません。

警告: map_each の呼び出し中に実行される print() ステートメントは、目に見える出力を生成しません。

format_each string;または None デフォルトは None
です map_each 関数によって返される各文字列に適用される、オプションの形式設定文字列パターン。形式文字列には「%s」を 1 つだけ含める必要がありますプレースホルダ。
before_each 文字列、または None。デフォルトは None
values から派生した各引数の前に追加するオプションの引数。
omit_if_empty デフォルトは True
true の場合、追加する values から派生した引数がない場合、それ以降の処理はすべて抑制され、コマンドラインは変更されません。false の場合、他の引数があるかどうかにかかわらず、引数名と terminate_with(指定されている場合)は追加されます。
uniquify デフォルトは False
true に設定すると、values から派生した重複する引数は省略されます。各引数が最初に一致したもののみが残ります。通常、depset では重複がすでに除外されているため、この機能は必要ありませんが、map_each が複数のアイテムに対して同じ文字列を出力する場合は便利です。
expand_directories デフォルトは True
true に設定すると、values 内のディレクトリがファイルのフラットなリストに展開されます。これは map_each が適用される前に行われます。
terminate_with string;または None デフォルトは None
です 他のすべての引数の後に追加するオプションの引数。omit_if_empty が true(デフォルト)で、他のアイテムが追加されていない場合(values が空の場合や、そのアイテムがすべてフィルタされている場合など)、この引数は追加されません。
allow_closure デフォルトは 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 シーケンスまたは depset(デフォルトは unbound
項目が結合されるリスト、タプル、または depset。
join_with 必須
string.join() と同じ方法で map_eachformat_each を適用して取得した文字列を結合するために使用される区切り文字。
map_each 呼び出し可能。または None。デフォルトは None
add_all と同じ。
format_each 文字列、または None。デフォルトは None
add_all と同じです。
format_joined string;または None デフォルトは None
です 結合された文字列に適用されるオプションの形式文字列パターン。形式文字列には「%s」を 1 つだけ含める必要がありますプレースホルダ。
omit_if_empty デフォルトは True
true の場合、values が空であるか、そのアイテムがすべてフィルタされているために結合する文字列がない場合、それ以降の処理はすべて抑制され、コマンドラインは変更されません。false の場合、結合する文字列がない場合でも、2 つの引数が追加されます。引数名の後に空の文字列(ゼロの文字列を論理的に結合したもの)が続きます。
uniquify デフォルトは False
add_all と同じです。
expand_directories デフォルトは True
add_all と同じです。
allow_closure デフォルトは False
add_all と同じです。

set_param_file_format

Args Args.set_param_file_format(format)

パラメータ ファイルの形式を設定します(使用している場合)。

パラメータ

パラメータ 説明
format 必須
次のいずれかにする必要があります。
  • 「multiline」:各項目(引数名または値)は、改行文字でパラメータファイルにそのまま書き込まれます。
  • 「shell」: 「multiline」と同じですが、アイテムはシェル引用符で囲まれます
  • "flag_per_line": "multiline" と同じですが、(1) フラグ(「--」で始まる)のみが param ファイルに書き込まれ、(2)フラグの値(存在する場合)は '=' を使って同じ行に書き込まれます。使用します。これは、Abseil フラグ ライブラリで想定される形式です。

デフォルトの形式は「shell」です。渡されます。

use_param_file

Args Args.use_param_file(param_file_arg, *, use_always=False)

引数を params ファイルにスピルし、param ファイルへのポインタに置き換えます。システムのコマンド長の上限に対して引数が大きすぎる可能性がある場合に使用します。

Bazel は、効率性を高めるために、実行中に params ファイルを出力ツリーに書き込むことを省略する場合があります。アクションをデバッグしていて param ファイルを調べる場合は、ビルドに --materialize_param_files を渡します。

パラメータ

パラメータ 説明
param_file_arg 必須
「%s」を 1 つ含むフォーマット文字列。引数が params ファイルにあふれた場合、params ファイルのパスでフォーマットされたこの文字列で構成される引数に置き換えられます。

たとえば、引数がパラメータ ファイル「params.txt」にスピルされる場合、「--file=%s」を指定すると、アクション コマンドラインには「--file=params.txt」が含まれます。

use_always デフォルトは False
です。常に引数を params ファイルにスピルするかどうかを指定します。false の場合、bazel はシステムと引数の長さに基づいて、引数をあふれさせる必要があるかどうかを判断します。