本文由 简悦SimpRead 转码,原文地址 blog.gradle.org
这是关于增量开发的系列博文的第一篇--部分......。
这是关于增量开发的系列博文的第一篇--软件开发过程中经常做小改动的那一部分。我们将讨论即将推出的Gradle构建工具功能,这些功能可以大大改善围绕这一用例的反馈时间。
本博文在该功能在Gradle 6.7中已经可以投入生产后进行了更新。
在Gradle 6.5中,我们引入了一个实验性的功能,叫做 文件系统观察 ,它可以显著加速增量构建。当启用时,它允许Gradle在两次构建之间将它所了解的文件系统保留在内存中,而不是在每次构建时轮询文件系统。这大大减少了确定自上一次构建以来有什么变化所需的磁盘I/O量。
从Gradle 6.7开始,这个功能已经可以在生产中使用了。我们正计划在以后的版本中默认启用该功能。
它是如何工作的?
为了确定Gradle是否需要执行一个任务,它需要检查其输入和输出文件自上次构建以来是否有变化。守护进程将这些关于文件系统的信息存储在内存中,直到当前的构建结束,我们称之为 虚拟文件系统 。
如果没有文件系统监视,守护进程不知道文件系统在两次构建之间发生了什么,因此它必须在每次构建结束时丢弃所有收集到的关于文件系统的信息。当文件系统监视被启用时,守护进程指示操作系统通知它磁盘上的变化。由于守护进程知道自上一次构建以来有什么变化,它可以在虚拟文件系统中重新使用所有未改变的位置的信息,避免不必要的磁盘I/O。
Gradle为最近版本的Linux、macOS和Windows提供了必要的集成。其他操作系统不被支持。
行动中的文件系统观察
你可以通过传递命令行开关--watch-fs或设置一个Gradle属性来启用文件系统监视。一旦它被启用,Gradle守护进程将做以下工作。
- 开始观察文件系统的变化。
- 在构建期间和构建之间保持虚拟文件系统。
注意: 我们启用了粗略的日志记录,以查看文件系统观察的效果。
$ ./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项目中,我们看到一个小改动的构建时间有如下改进。
在这个例子中,我们多次运行相同的构建,在启用文件系统监视后,我们平均看到~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来启用 experimental 功能。
请记住,只有在同一守护程序上连续构建时,你才会看到性能的改善,启用该功能。
如果你遇到任何问题,请查看用户手册中的故障排除部分。如果你仍然有问题,请通过Gradle社区Slack联系我们。
我们也很想听到你在构建中看到的改进。请在Gradle社区Slack中分享你的成功故事。如果你想对你的构建进行基准测试,你可以按照这个仓库中的说明,用Gradle profiler轻松完成。
关于本地增量构建的快速反馈,这并不是故事的结束。我们还计划在接下来的Gradle版本中进行进一步的改进!