文件系统观察使用介绍

177 阅读4分钟

这是关于增量开发的系列博文的第一篇--软件开发过程中经常进行小改动的部分。我们将讨论即将推出的Gradle构建工具功能,这些功能大大改善了围绕这一用例的反馈时间。

这篇博文在该功能在Gradle 6.7中已经可以投入生产后进行了更新。

在Gradle 6.5中,我们引入了一个名为文件系统观察的实验性功能,它可以显著加速增量构建。 当启用时,它允许Gradle在两次构建之间将它对文件系统的了解保留在内存中,而不是在每次构建时轮询文件系统。 这大大减少了确定自上一次构建以来有什么变化所需的磁盘I/O量。

从Gradle 6.7开始,这个功能就可以在生产中使用了。 我们正计划在以后的版本中默认启用这个功能。

它是如何工作的?

为了确定Gradle是否需要执行一个任务,它需要检查自上次构建以来是否有任何输入和输出文件发生了变化。 守护进程将这些关于文件系统的信息保存在内存中,直到当前构建结束,我们称之为虚拟文件系统。

如果没有文件系统监视,守护进程不知道文件系统在两次构建之间发生了什么,因此它必须在每次构建结束时丢弃所有收集到的关于文件系统的信息。 当文件系统监视被启用时,守护进程会指示操作系统通知它磁盘上的变化。 由于守护进程知道自上次构建以来有什么变化,它可以重新使用虚拟文件系统中所有未改变的位置的信息,避免了不必要的磁盘I/O。

Gradle为最近版本的Linux、macOS和Windows提供了必要的集成。 其他操作系统不被支持。

运行中的文件系统观察

你可以通过传递命令行开关--watch-fs 或设置Gradle属性来启用文件系统观察。 一旦启用,Gradle守护进程将做以下工作。

  • 开始观察文件系统的变化。
  • 在构建期间和构建之间保持虚拟文件系统。

**注意:**我们启用的是verbose日志,以查看文件系统观察的效果。

$ ./gradlew --watch-fs -Dorg.gradle.vfs.verbose=true :core:testClasses

Starting a Gradle Daemon

BUILD SUCCESSFUL in 24s
254 actionable tasks: 1 executed, 253 up-to-date

Received 11 file system events for current build while watching 1 hierarchies
Virtual file system retains information about 34797 files, 3845 directories and 128 missing files till next build

正如你所看到的,Gradle守护进程在第一次构建过程中了解了不少关于文件系统的信息。 所有这些信息只对用于运行这个特定构建的守护进程可用。

现在,让我们对一个源文件做一个改动。 Gradle会检测到这个改动,并更新虚拟文件系统中关于源文件的信息。 然后再运行一次构建。

$ ./gradlew --watch-fs -Dorg.gradle.vfs.verbose=true :core:testClasses

Received 14 file system events since last build while watching 1 hierarchies
Virtual file system retained information about 34796 files, 3838 directories and 128 missing files since last build

BUILD SUCCESSFUL in 6s
254 actionable tasks: 3 executed, 251 up-to-date

Received 117 file system events for current build while watching 1 hierarchies
Virtual file system retains information about 34797 files, 3845 directories and 128 missing files till next build

注意,自上次构建以来,守护进程收到了一些事件,并更新了虚拟文件系统的部分内容。 尽管大部分信息仍然保持不变。

构建时间的改进

该功能的实际影响取决于许多因素,但总的来说,它应该会使增量构建的构建时间大大减少。 例如,在Santa Tracker Android项目中,我们看到一个小变化的构建时间有如下改进:

image.png 在这个例子中,我们多次运行相同的构建,在启用文件系统监视后,我们平均看到~150ms(或20%)的执行时间。

尝试一下文件系统监视

如果你想看看你的项目是如何从文件系统监视中受益的,下面是你可以尝试的方法。

首先,确保你运行Gradle 6.7或更高版本。 为了启用文件系统监视,你需要在命令行中传递--watch-fs 。 或者,在项目目录中添加

org.gradle.vfs.watch=true

到项目目录或Gradle用户主页的gradle.properties ,这样你就不需要在每次构建时传递命令行选项了。 就这样:下次构建时将启用文件系统监视。

**注意:**在Gradle 6.5和6.6中,该实验性功能可以通过org.gradle.unsafe.watch-fs=true

请记住,只有在同一守护进程的连续构建中启用该功能时,你才能看到性能的改善。

如果你遇到任何问题,请查看用户手册中的故障排除部分。 如果你仍然有问题,请通过Gradle社区的Slack联系我们。

我们也很乐意听到你在构建中看到的改进,请在Gradle社区Slack中分享你的成功故事。 如果你想对你的构建进行基准测试,你可以通过Gradle profiler按照这个软件库中的说明来轻松完成。

关于本地增量构建的快速反馈,这并不是故事的结束。 我们还计划在接下来的Gradle版本中进行进一步的改进。