第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.
- 第6章 持续构建
- 持续构建
- 持续构建
- 第 6 章 构建 Web 应用程序
- 《持续交付》笔记——第3章 持续集成
- 一种持续构建构想
- 持续集成平台构建
- jenkins持续构建
- Jenkins持续构建
- ant持续构建
- 构建持续集成平台
- Jenkins 持续集成构建
- TFS2017持续集成构建
- Android持续构建
- 第7章 组合构建
- 第4代白盒测试方法实践之“使用VcTester构造持续集成及每日构建平台”
- 第8章、MongoDB持续记录
- 第6章 构建可启动的系统镜像
- Fastjson SerializerFeature详解
- RabbitMQ消息队列-Centos7下安装RabbitMQ3.6.1
- java线程---基础(二)
- cmd进入指定盘符
- Delphi-字符串函数
- 第6章 持续构建
- 论为什么需要软件工程
- Educational Codeforces Round 34
- 商品列表(MVp)
- 【cuda】This graphics driver could not find compatible graphics hardware..
- -bash: rvm: command not found'
- LeetCode Self Dividing Numbers
- 机器学习之贝叶斯分类器
- ElasticSearch Java客户端简易使用教程