引数

問題を報告 ソースを表示

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

多くの場合、アクションには、推移的な依存関係から蓄積された値を含む大きなコマンドラインが必要です。たとえば、リンカーのコマンドラインでは、リンクされるすべてのライブラリで必要なすべてのオブジェクト ファイルを一覧表示できます。このような推移的データは、複数のターゲットで共有できるように 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*() メソッドの 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],
  ...
)

メンバー

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 にする必要があります。リスト、タプル、デセット、またはディレクトリは、このメソッドではなく add_all() または add_joined() に渡す必要があります。
format string; or None; default = None
文字列文字列の value に適用する書式文字列パターン。

すべて追加

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 文字列は、リスト内の既存の各引数の前に新しい引数として挿入されます。これにより、この時点で加算する引数の数が倍になります。
  6. リストが空で、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
アイテムを追加するリスト、タプル、またはデセット。
map_each callable; or None; default = None
各項目を 0 個以上の文字列に変換する関数で、追加前に追加で処理される場合があります。このパラメータを指定しない場合は、標準のコンバージョンが使用されます。

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

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

  • 一般的に、各アイテムが 1 つの文字列に変換されると、関数はその文字列を返します。
  • アイテムを完全にフィルタする場合、関数は None を返します。
  • 項目が複数の文字列に変わると、関数はそれらの文字列のリストを返します。
1 つの文字列を返すと、None でそれぞれ長さ 1 または長さ 0 のリストを返す場合と同じ結果が得られます。必要以上にリストを作成するのではなく、より効率的で読みやすいものにします。

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

大規模な分析フェーズのデータ構造を実行フェーズで意図せず保持しないようにするには、最上位の def ステートメントで map_each 関数を宣言する必要があります。デフォルトでは、この関数は関数をネストしない可能性があります。

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

format_each string; or None; default = None
map_each 関数で返される各文字列に適用される、省略可能な形式設定文字列パターン。形式設定文字列には「%s」プレースホルダを 1 つだけ含める必要があります。
before_each string; or None; default = None
values から導出された各引数が付加されるオプションの引数。
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
アイテムが結合されるリスト、タプル、またはデセット。
join_with 必須
string.join() と同様に、map_eachformat_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 = False
add_all と同じです。
expand_directories デフォルトは true です。
add_all と同じです。
allow_closure default = False
add_all と同じです。

set_param_file_format

Args Args.set_param_file_format(format)

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

パラメータ

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

呼び出されない形式はデフォルトの「shell」になります。

#use_param_file

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

引数をパラメータ ファイルにスピルし、パラメータ ファイルへのポインタに置き換えます。引数がシステムのコマンド長の制限に対して大きすぎる場合に使用します。

Bazel は、効率化を図るために、パラメータ ファイルを出力ツリーに書き込まないようにすることもできます。アクションをデバッグする際にパラメータ ファイルを検査する場合は、ビルドに --materialize_param_files を渡します。

パラメータ

パラメータ 説明
param_file_arg 必須
単一の「%s」を含むフォーマット文字列。引数がパラメータ ファイルにスピルされた場合、それらはパラメータ ファイルのパスが書式設定されたこの文字列で構成される引数に置き換えられます。

たとえば、引数がパラメータ ファイル「params.txt」にオーバーフローした場合、「--file=%s」と指定すると、アクション コマンドラインに「--file=params.txt」が含まれるようになります。

use_always default = False
常にパラメータ ファイルに引数をスピルするかどうかを指定します。false の場合、システムと引数の長さに基づいて、引数をオーバーフローする必要があるかどうかを判断します。