我有一个运行自定义工具的bazel通用规则,用于处理特定的输入文件集并生成输出。问题是,定制工具每次运行都需要很长时间,但并不是输入文件集中的每个更改都与定制工具的输出有关。为了检测更改是否重要,我有另一个脚本,它可以解析输入,并在自定义工具的输出将有所不同时快速提供信息。
我不能在Bazel中实现上面的内容。我想要实现的方式如下
INPUT_FILES --------> [RULE1] --------> OUTPUT
| ^
| |
| |
--------------> [RULE2]RULE2's输出应该决定是否应该运行RULE1。但是当它必须运行时,RULE1应该可以使用INPUT_FILES。因此,在执行RULE1时,缓存命中/未命中计算基本上只应考虑RULE2's输出,而INPUT_FILES应被忽略。有没有办法做到这一点?
编辑:我尝试了一些实验,如果我在禁用沙箱的情况下执行RULE1和RULE2,我可以实现这一点。这使得RULE2可以在不显式列出的情况下访问RULE1的输入,这看起来很奇怪,但如果有一种方法可以为规则共享一个沙箱,而不是在没有沙箱的情况下同时执行两个沙箱,那就很好了。
发布于 2018-11-09 04:52:27
我不知道有一种方法可以做到你所描述的,但是还有其他策略可能对你有效。(我认为还有一个额外的复杂性,那就是RULE2无法访问INPUT_FILES的前一个状态,因此它没有任何东西可以比较来查看输入中发生了什么变化)。
一种策略是处理输入文件,以便删除所有无关紧要的部分,并且RULE1中的长期运行工具只看到“重要”内容。当然,这取决于您的工具和规则到底做了什么,但它可能会起作用。
举个简单的例子,你可以有一个工具从代码中删除注释(以保留行号的方式),然后编译器操作只看到代码文件。因此,如果您对注释进行了更改,则编译器的输入是相同的,bazel将跳过该操作。
这类似于bazel使构建java规则更具增量的做法。有一个工具可以从java源代码中生成一个"header jar“,它只包含类接口,而上游规则只能看到header jar。这样,只有对类的接口的更改才会导致上游规则重新运行,而对注释或方法实现的更改则不会。
https://stackoverflow.com/questions/53211371
复制相似问题