複数のソリューションがあります。
最もクリーンな方法は、ビルド時に検証を行うことです。検証するファイル(またはファイルのバッチ)ごとにgenrule
を作成し、検証が成功するとgenruleは何かを出力します。ルールは何も出力しません。自動的にビルドに失敗します。
検証の成功はファイルの内容に依存し、同じ入力で同じ出力が得られるので、入力の内容に依存する出力ファイルを生成する必要があります。最も便利なのは、検証が成功した場合はファイルのダイジェストを出力に書き出し、検証が失敗した場合は出力を出力しないことです。
検証者を再利用可能にするには、Skylark macroを作成して、すべてのパッケージで使用できます。
これをまとめるには、次のように記述します。 //tools:py_verify_test.bzl
の
内容://tools:build_test.sh
の
def py_verify_test(name, srcs, visibility = None):
rules = {"%s-file%d" % (name, hash(s)): s for s in srcs}
for rulename, src in rules.items():
native.genrule(
name = rulename,
srcs = [s],
outs = ["%s.md5" % rulename],
cmd = "$(location //tools:py_verifier) $< && md5sum $< > [email protected]",
tools = ["//tools:py_verifier"],
visibility = ["//visibility:private"],
)
native.sh_test(
name = name,
srcs = ["//tools:build_test.sh"],
data = rules.keys(),
visibility = visibility,
)
内容://tools:BUILD
の
#!/bin/true
# If the test rule's dependencies could be built,
# then all files were successfully verified at
# build time, so this test can merely return true.
内容:ファイルを確認したい任意のパッケージの
# I just use sh_binary as an example, this could
# be a more complicated rule of course.
sh_binary(
name = "py_verifier",
srcs = ["py_verifier.sh"],
visibility = ["//visibility:public"],
)
内容:
load("//tools:py_verify_test.bzl", "py_verify_test")
py_verify_test(
name = "verify",
srcs = glob(["**/*.py"]),
)