2 つの入力を受け取り、出力 (2 つの入力の差) とリターン コード (2 つの入力が一致する場合は 0、一致しない場合は 1) の両方を返すテスト ツール (大まかに言えば、差分ツール) があります。これは Kotlin で構築されて//java/fr/enoent/phosphorus
おり、私のリポジトリで利用できます。
何かによって生成されたファイルが、リポジトリに既に存在する参照ファイルと同一であることをテストするルールを作成したいと考えています。ctx.actions.run
問題は、設定したルールが、そのルールによってビルドされtest = True
た実行可能ファイルを返す必要があることです (ルールに提供されるツールではありません)。次に、次のように、例に従ってシェルスクリプトでラップしようとしました:
def _phosphorus_test_impl(ctx):
output = ctx.actions.declare_file("{name}.phs".format(name = ctx.label.name))
script = phosphorus_compare(
ctx,
reference = ctx.file.reference,
comparison = ctx.file.comparison,
out = output,
)
ctx.actions.write(
output = ctx.outputs.executable,
content = script,
)
runfiles = ctx.runfiles(files = [ctx.executable._phosphorus_tool, ctx.file.reference, ctx.file.comparison])
return [DefaultInfo(runfiles = runfiles)]
phosphorus_test = rule(
_phosphorus_test_impl,
attrs = {
"comparison": attr.label(
allow_single_file = [".phs"],
doc = "File to compare to the reference",
mandatory = True,
),
"reference": attr.label(
allow_single_file = [".phs"],
doc = "Reference file",
mandatory = True,
),
"_phosphorus_tool": attr.label(
default = "//java/fr/enoent/phosphorus",
executable = True,
cfg = "host",
),
},
doc = "Compares two files, and fails if they are different.",
test = True,
)
(phosphorus_compare
実際のコマンドを生成する単なるマクロです。)
ただし、このアプローチには 2 つの問題があります。
- このように出力を宣言することはできません。それはどのアクションにもリンクされていません (そして Bazel はそれについて不平を言っています)。テストの出力を宣言する必要はないのではないでしょうか? Bazel は、テストが失敗したときにテスト フォルダー内の何かを使用できるようにしますか?
- ツールの実行に必要な実行ファイルは、テストの実行時に利用できないようです。
java/fr/enoent/phosphorus/phosphorus: line 359: /home/kernald/.cache/bazel/_bazel_kernald/58c025fbb926eac6827117ef80f7d2fa/sandbox/linux-sandbox/1979/execroot/fr_enoent/bazel-out/k8-fastbuild/bin/tools/phosphorus/tests/should_pass.runfiles/remotejdk11_linux/bin/java: No such file or directory
全体として、シェル スクリプトを使用すると、不必要な間接化が追加され、一部のコンテキスト (ツールの実行ファイルなど) が失われるだけのように感じます。理想的には、ctx.actions.run
その戻りコードを使用して依存するだけですが、テストで実行可能ファイルを生成する必要があるように見えるため、それはオプションではないようです。そのようなルールを書くための正しいアプローチは何でしょうか?