第6章 持续构建

来源:互联网 发布:雪梨开的淘宝店店名 编辑:程序博客网 时间:2024/05/29 18:02

注意:持续构建是一个孵化中的特性。这意味着它还不太完善,未在生产环境中普遍应用。同时此文档在将来可能不再适用。

通常来说,你告诉Gradle去执行某个任务完成某次构建,Gradle会判断出执行当前任务需要执行的所有任务,执行完毕后停止工作,直至下次任务输入。持续构建(continuous build)稍有不同,Gradle会一直检测上次构建的内容有没有过期,一旦发现上次构建的内容过期,就会重新执行构建任务。例如,假如你使用compile编译了Java源文件为class文件,持续构建功能如果检测到Java源文件发生了变化就会自动执行compile任务。这在某些场景下是有意义的。

6.1. 如何开启和关闭持续构建

你可以使用--continuous-t开关属性开启自动构建,例如gradle build --continuous的运行结果与gradle build一样,但是会持续监控build的输入有没有变化,一点发现了输入有变化,会再次执行build任务。

示例 6.1 开启持续构建

gradle build --continuous的运行结果:

>gradle build --continuousContinuous build is an incubating feature.BUILD SUCCESSFUL in 2s2 actionable tasks: 1 executed, 1 up-to-date[1] Waiting for changes to input files of tasks... (ctrl-d then enter to exit)[2] modified: test\src\main\java\obj\TestMain.javaChange detected, executing build...BUILD SUCCESSFUL in 0s2 actionable tasks: 2 executedWaiting for changes to input files of tasks... (ctrl-d then enter to exit)<-------------> 0% WAITING> IDLE

第一次构建运行到[1]停止,等待输入的变化。如果此时修改了TestMain.java文件,Gradle会检测到,开始[2]的执行,重新构建工程。

你可以使用ctrl + d然后回车退出持续构建。如果没有交互界面(比如使用脚本启动构建),需要你使用杀进程的方式关闭。

6.2. 如何实现顺序构建

任务的文件输入(file inputs)

任务定义中使用InputFiles属性或类似的注解声明文件系统的输入。详情请见Section 19.10, “Up-to-date checks (AKA Incremental Build)

上面的示例中我们只改变了任务的输入文件,Gradle启动后会检测任务的输入文件是否有变化,一旦发现输入文件有变化就会再次执行构建任务。但是其他文件的变化不会触发再次构建。例如你改变了build脚本文件,或者再监控期间修改了Gradle的配置文件,这些改变不会引发新的构建,要想实现这些改变,必须手动重启构建任务。

下面我们来看一个使用Java plugin的典型构建,工程使用约定的文件结构。下图显示了gradle build任务的依赖结构:

图 6.1 Java plugin任务结构

下面是图中主要任务的输入文件路径:

compileJava

src/main/java

processResources

src/main/resources

compileTestJava

src/test/java

processTestResources

src/test/resources

一次构建工作已经完成,然后修改上面目录的文件或添加、删除文件,持续构建机制会重新构建工程。例如src/main/java目录下文件被修改,会触发再次构建,而Gradle的增量构建功能有确保了只有被影响的任务会执行(compileJava被执行而compileTestJava被跳过)。

6.3. 局限与问题

当前持续构建的实现方式有几个问题,将来的放行版可能会解决。

6.3.1. 循环构建

输入文件的变化会引发任务执行,如果任务执行过程中又修改自己的输入文件,就会引发循环构建。在正常的单次构建中,如果任务修改的自己的输入文件,Gradle也不会任务你的任务是up-to-date,下次仍会别执行。

出现循环构建时,你首先要检测你的任务有没有修改输入的情况,也可以使用--info参数查看任务执行日志,来找到问题的根源。

6.3.2. 对Java9的限制

由于Java9中class访问限制的原因,有些操作系统中,Gradle参数无法被设置。

  • On macOS, Gradle will poll for file changes every 10 seconds instead of every 2 seconds.

  • On Windows, Gradle must use individual file watches (like on Linux/Mac OS), which may cause continuous build to no longer work on very large projects.

6.3.3. 性能和稳定性

macOS平台上依赖于system polling的效率,大型项目可能会查询文件变动识别延迟的现象。系统压力大的时候也可能会出现死锁现象。

Linux平台的OpenJDK可能会出现文件漏识别的现象。

6.3.4. 改变软链接

Creating or removing symbolic link to files will initiate a build.

Modifying the target of a symbolic link will not cause a rebuild.

Creating or removing symbolic links to directories will not cause rebuilds.

Creating new files in the target directory of a symbolic link will not cause a rebuild.

Deleting the target directory will not cause a rebuild.

原创粉丝点击