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