首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Bazel规则中,如何从缓存命中/未命中检测中排除某些输入文件

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

Stack Overflow用户
提问于 2018-11-08 23:51:13
回答 1查看 400关注 0票数 1

我有一个运行自定义工具的bazel通用规则,用于处理特定的输入文件集并生成输出。问题是,定制工具每次运行都需要很长时间,但并不是输入文件集中的每个更改都与定制工具的输出有关。为了检测更改是否重要,我有另一个脚本,它可以解析输入,并在自定义工具的输出将有所不同时快速提供信息。

我不能在Bazel中实现上面的内容。我想要实现的方式如下

代码语言:javascript
复制
INPUT_FILES --------> [RULE1] --------> OUTPUT
     |                   ^
     |                   |
     |                   |
      --------------> [RULE2]

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

编辑:我尝试了一些实验,如果我在禁用沙箱的情况下执行RULE1RULE2,我可以实现这一点。这使得RULE2可以在不显式列出的情况下访问RULE1的输入,这看起来很奇怪,但如果有一种方法可以为规则共享一个沙箱,而不是在没有沙箱的情况下同时执行两个沙箱,那就很好了。

EN

回答 1

Stack Overflow用户

发布于 2018-11-09 04:52:27

我不知道有一种方法可以做到你所描述的,但是还有其他策略可能对你有效。(我认为还有一个额外的复杂性,那就是RULE2无法访问INPUT_FILES的前一个状态,因此它没有任何东西可以比较来查看输入中发生了什么变化)。

一种策略是处理输入文件,以便删除所有无关紧要的部分,并且RULE1中的长期运行工具只看到“重要”内容。当然,这取决于您的工具和规则到底做了什么,但它可能会起作用。

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

这类似于bazel使构建java规则更具增量的做法。有一个工具可以从java源代码中生成一个"header jar“,它只包含类接口,而上游规则只能看到header jar。这样,只有对类的接口的更改才会导致上游规则重新运行,而对注释或方法实现的更改则不会。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53211371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档