拡張機能の作成に関する一般的な問題と質問をいくつかご紹介します。
ファイルが生成されない、またはアクションが実行されないのはなぜですか?
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
コマンドで実行される実行可能出力)の場合、
runfilesに含めることで入力を宣言します。path フィールドを使用する代わりに、
File.short_path を使用します。これは、バイナリが実行される
ランファイル ディレクトリに対するファイルの相対パスです。
bazel build //pkg:mytarget でビルドされるファイルを制御するにはどうすればよいですか?
DefaultInfo プロバイダを使用して
、デフォルトの出力を設定します。
ビルドの一部としてプログラムを実行したり、ファイルの I/O を行ったりするにはどうすればよいですか?
ツールは、ビルドの他の部分と同様にターゲットとして宣言でき、実行フェーズで実行して他のターゲットのビルドに役立てることができます。ツールを実行するアクションを作成するには、ctx.actions.run を使用し、ツールを executable パラメータとして渡します。
読み込みフェーズと分析フェーズでは、ツールを実行することも、ファイルの I/O を実行することもできません。 つまり、ツールとファイルの内容(BUILD ファイルと .bzl ファイルの内容を除く)は、ターゲット グラフとアクション グラフの作成方法に影響しません。
実行フェーズの前と実行フェーズ中に同じ構造化データにアクセスする必要がある場合はどうすればよいですか?
構造化データを .bzl ファイルとしてフォーマットできます。ファイルを load() して、読み込みフェーズと分析フェーズ中にアクセスできます。実行フェーズ中に必要なアクションと実行可能ファイルに、入力またはランファイルとして渡すことができます。
Starlark コードを記述するにはどうすればよいですか?
ルールとルール属性の場合は、ドキュメント文字列リテラル(三重引用符で囲むことも可能)を rule または attr.*() の doc パラメータに渡すことができます。ヘルパー
関数とマクロの場合は、ここに示されている形式に従って、三重引用符で囲まれたドキュメント文字列リテラルを使用します。通常、ルール実装関数には独自のドキュメント文字列は必要ありません。
想定される場所に文字列リテラルを使用すると、自動化ツールでドキュメントを抽出しやすくなります。コードの読みやすさに役立つ場合は、標準の文字列以外のコメントを自由に使用してください。