ここでは、拡張機能の作成に関する一般的な問題と質問をいくつか紹介します。
ファイルが作成されない / アクションが実行されない
Bazel は、リクエストされた出力ファイルの生成に必要なアクションのみを実行します。
必要なファイルにラベルがある場合は、直接リクエストできます。
bazel build //pkg:myfile.txt
ファイルがターゲットの出力グループにある場合は、コマンドライン(
bazel build //pkg:mytarget --output_groups=foo
)でその出力グループを指定する必要があります。コマンドラインにターゲットが記述されるたびにファイルが自動的にビルドされるようにする場合は、
DefaultInfo
プロバイダを返して、ルールのデフォルトの出力にターゲットを追加します。
詳細については、ルールページをご覧ください。
実装関数が実行されないのはなぜですか?
Bazel は、ビルドでリクエストされたターゲットのみを分析します。コマンドラインでターゲットに名前を付けるか、ターゲットに依存する名前を指定する必要があります。
アクションまたはバイナリを実行したときにファイルが見つからない
1)ファイルがアクションまたはバイナリへの入力として登録されていること、2)実行されているスクリプトまたはツールが正しいパスを使用してファイルにアクセスしていることを確認します。
アクションの場合は、アクションを作成する ctx.actions.*
関数に入力を渡すことで宣言します。ファイルの適切なパスは、File.path
を使用して取得できます。
バイナリ(bazel run
コマンドまたは bazel test
コマンドで実行される実行可能出力)の場合は、実行ファイルに入力を宣言します。path
フィールドを使用する代わりに、File.short_path
を使用します。これは、バイナリが実行される runfiles ディレクトリからの相対パスです。
bazel build //pkg:mytarget
でビルドされるファイルを制御するにはどうすればよいですか?
デフォルトの出力を設定するには、DefaultInfo
プロバイダを使用します。
ビルドの一環としてプログラムを実行したり、ファイル I/O を実行したりするにはどうすればよいですか?
ツールは、ビルドの他の部分と同様に、ターゲットとして宣言し、実行フェーズで実行して他のターゲットをビルドできます。ツールを実行するアクションを作成するには、ctx.actions.run
を使用し、ツールを executable
パラメータとして渡します。
読み込みフェーズと分析フェーズでは、ツールは実行できず、ファイル I/O も実行できません。つまり、ツールとファイルのコンテンツ(BUILD ファイルと .bzl ファイルのコンテンツを除く)は、ターゲット グラフとアクション グラフの作成方法に影響しません。
実行フェーズの前と最中に同じ構造化データにアクセスする必要がある場合はどうすればよいですか?
構造化データは .bzl ファイルとしてフォーマットできます。ファイルを load()
で指定することで、読み込みフェーズと分析フェーズでファイルにアクセスできます。実行フェーズで、これを必要とするアクションや実行可能ファイルに入力またはランファイルとして渡すことができます。
Starlark コードを文書化するにはどうすればよいですか?
ルールとルール属性については、docstring リテラル(三重引用符で囲む場合もあります)を rule
または attr.*()
の doc
パラメータに渡すことができます。ヘルパー関数とマクロについては、こちらの形式に従って、三重引用符で囲んだ docstring リテラルを使用してください。通常、ルール実装関数に独自の docstring は必要ありません。
想定される場所で文字列リテラルを使用すると、自動ツールでドキュメントを簡単に抽出できます。コードを読む際に役立つものであれば、文字列以外の標準のコメントを自由に使用できます。