Istnieje więcej niż jedno rozwiązanie.
Najczystszym sposobem jest wykonanie weryfikacji w czasie kompilacji: tworzysz plik genrule
dla każdego pliku (lub partii plików), który chcesz zweryfikować, a jeśli weryfikacja się powiedzie, wynik zostanie wygenerowany, jeśli się nie powiedzie, nie generuje niczego, co automatycznie kończy się niepowodzeniem.
Ponieważ powodzenie weryfikacji zależy od zawartości pliku, a to samo wejście powinno dać ten sam wynik, genrules powinien wytworzyć plik wyjściowy, który zależy od zawartości danych wejściowych. Najwygodniejszą rzeczą jest zapisanie skrótu pliku (ów) na wyjściu, jeśli weryfikacja się powiedzie, i brak danych wyjściowych, jeśli weryfikacja nie powiedzie się.
Aby umożliwić ponowne użycie weryfikatora, można utworzyć numer Skylark macro i używać go we wszystkich swoich pakietach.
Aby umieścić to wszystko razem, należy napisać coś takiego.
Zawartość //tools:py_verify_test.bzl
:
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,
)
zawartość //tools:build_test.sh
:
#!/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.
zawartość //tools:BUILD
:
# 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"],
)
Zawartość każdego pakietu, który chce zweryfikować pliki:
load("//tools:py_verify_test.bzl", "py_verify_test")
py_verify_test(
name = "verify",
srcs = glob(["**/*.py"]),
)