繁体   English   中英

在Bazel规则中,如何从缓存命中/未命中检测中排除某些输入文件

[英]In a Bazel rule, how can I exclude certain input files from cache hit/miss detection

我有一个bazel genrule,它运行自定义工具来处理某些输入文件集并生成输出。 问题在于自定义工具每次运行都会花费很长时间,但是并非输入文件集的每项更改都与自定义工具的输出有关。 为了检测更改是否重要,我有另一个脚本可以解析输入内容,并在自定义工具的输出将有所不同时迅速提供信息。

我无法在Bazel中实现上述功能。 我想实现的方式如下

INPUT_FILES --------> [RULE1] --------> OUTPUT
     |                   ^
     |                   |
     |                   |
      --------------> [RULE2]

RULE2's输出应确定RULE1是否应运行。 但是当它必须运行时, INPUT_FILES应该对RULE1可用。 因此,在执行RULE1 ,基本上只RULE2's输出用于缓存命中/未命中计算,而应忽略INPUT_FILES 有没有办法做到这一点?

编辑:我尝试了一些实验,如果我在禁用沙箱的情况下执行RULE1RULE2 ,则能够实现这一点。 这允许RULE2访问RULE1的输入而无需显式列出它们。 这似乎很麻烦,但是如果有一种方法可以为规则共享一个沙箱,而不是在没有沙箱的情况下执行两个沙漏,那可能很好。

我不知道执行您所描述的方法的方法,但是还有其他一些策略可能对您有用。 (这里有一个额外的复杂性,我认为,这是RULE2将无法访问以前的状态INPUT_FILES ,所以它不会有什么比较对,看看有什么在投入已经改变)。

一种策略是处理输入文件,以便删除所有无关紧要的部分,而RULE1长时间运行的工具只会看到“重要”的东西。 当然,这完全取决于您的工具和规则执行的操作,但它可能起作用。

举一个简单的例子,您可以使用一个工具从代码中删除注释(以保留行号的方式),然后编译器操作只会看到仅代码文件。 因此,如果对注释进行更改,则编译器的输入是相同的,并且bazel会跳过该操作。

这类似于bazel使构建Java规则更具增量性所做的工作。 有一个工具可以从Java源代码生成“标头jar”,该工具仅包含类接口,而上游规则则只能看到标头jar。 这样,只有对类的接口进行更改才能使上游规则重新运行,而对注释或方法实现的更改则不会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM