拡張機能の作成に関する一般的な問題と質問は次のとおりです。
ファイルが生成されない、またはアクションが実行されないのはなぜですか?
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()
して、読み込みフェーズと分析フェーズでアクセスできます。実行フェーズで必要なアクションや実行可能ファイルに入力または runfile として渡すことができます。
Starlark コードのドキュメント化はどのように行うべきですか?
ルールとルール属性の場合、rule
または attr.*()
の doc
パラメータに docstring リテラル(三重引用符で囲むことも可能)を渡すことができます。ヘルパー関数とマクロの場合は、こちらの形式に従って、三重引用符で囲まれた docstring リテラルを使用します。通常、ルール実装関数に独自の docstring は必要ありません。
文字列リテラルを適切な場所で使用すると、自動化されたツールでドキュメントを簡単に抽出できます。コードの読者の役に立つのであれば、標準の文字列以外のコメントを自由に使用してください。