每当在IntelliJ和命令行之间切换时,为什么Bazel会进行完全重建?

时间:2018-10-26 16:17:48

标签: intellij-idea bazel

对于同一项目,我同时在the Bazel IntelliJ plugin和命令行中工作。

每当我从IntelliJ中重新“使用BUILD文件同步项目”,或者从命令行执行新的bazel build时,无论我最后做的哪一个都迫使另一人完全重建我的项目(具有100个目标)。

例如,如果我从IntelliJ中运行测试,然后从命令行执行bazel build //...之类的操作,甚至从CLI运行相同的测试,我都会得到:

$ bazel test //foo:bar
INFO: Build options have changed, discarding analysis cache.
...

这迫使我的项目重建Protobuf和其他不快速的本地事物。

这是为什么?

例如,我看到IntelliJ调用测试时,它具有bazel命令的完整参数集,而我从不在CLI中指定任何参数:

/usr/local/bin/bazel test --tool_tag=ijwb:IDEA:ultimate \
--curses=no --color=yes --experimental_ui=no \
--progress_in_terminal_title=no --runs_per_test=1 \
--flaky_test_attempts=1 \
--build_event_binary_file=/var/folders/08/fk59w_xd4zz2phs6q6r3r5mc0000gn/T/intellij-bep-b37bc093-86b4-4a03-9599-a45e7285f6ac \
--nobuild_event_binary_file_path_conversion \
--test_filter=com.spotify.spyglass.knightcrock.CommitInfoParserTest# 
-- //knightcrock-consumer:CommitInfoParserTest

我所遇到的正是https://github.com/bazelbuild/bazel/issues/3433中所描述的内容,该内容已关闭,并且没有在错误的位置打开注释。

1 个答案:

答案 0 :(得分:2)

导致分析重新运行的特定选项是--test_filter。其他选项不应影响构建配置,因此,如果在命令行上指定相同的测试过滤器,则不应看到重新运行分析。

要解决此问题,以便并非所有分析都需要重新运行,就需要进行配置修整,这是一项正在积极努力的工作。

请注意,仅应重新运行分析。仍然有一个本地动作缓存,因此bazel应注意并非实际上需要重建所有内容。最好通过与--subcommands一起运行来确认这一点,以查看当您从命令行尝试使用其他--test_filter时运行的bazel。

此外,可能值得提出一个有关打印哪些选项导致分析缓存被删除的打印问题,以便更容易地诊断这种情况。