एक से अधिक समाधान हैं।
बिल्ड समय पर सत्यापन करना सबसे साफ तरीका है: आप प्रत्येक फ़ाइल (या फाइलों का बैच) के लिए genrule
बनाते हैं, और यदि सत्यापन सफल होता है, तो जनरेट कुछ विफल हो जाता है, अगर यह विफल हो जाता है, तो नियम कुछ भी आउटपुट नहीं करता है, जो स्वचालित रूप से बिल्ड को विफल करता है।
सत्यापन की सफलता फ़ाइल की सामग्री पर निर्भर करती है, और उसी इनपुट में एक ही आउटपुट उत्पन्न होना चाहिए, जेनरल को आउटपुट फ़ाइल का उत्पादन करना चाहिए जो इनपुट की सामग्री पर निर्भर है। सबसे सुविधाजनक बात यह है कि सत्यापन सफल होने पर आउटपुट में फ़ाइल के पाचन को लिखना है, और सत्यापन विफल होने पर कोई आउटपुट नहीं है।
सत्यापनकर्ता पुन: प्रयोज्य बनाने के लिए, आप Skylark macro बना सकते हैं और अपने सभी संकुलों में इसका उपयोग कर सकते हैं।
यह सब एक साथ रखने के लिए, आप निम्न की तरह कुछ लिखेंगे। //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,
)
//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.
//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"],
)
किसी भी पैकेज फ़ाइलों सत्यापित करना चाहती है कि की सामग्री:
load("//tools:py_verify_test.bzl", "py_verify_test")
py_verify_test(
name = "verify",
srcs = glob(["**/*.py"]),
)