多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
**(以下所有内容都是根据[官方文档](https://www.gradle.org/docs/current/userguide/userguide.pdf)学习。如果你对gradle有兴趣,希望你能直接学习官方文档,官方文档是最权威的。而且这样才能产生2份有意义的学习资料)** ## 1.执行多个任务 在命令行下,要想执行多个任务,可以在gradle关键字后面跟多个任务名,之间要用空格隔开,执行的顺序按照你的输入的顺序执行。例如我们要执行编译和测试的任务。可以在命令行下输入: ~~~ D:\GRADLE~2\0109>gradle compile test :compile1 nihao :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE BUILD SUCCESSFUL Total time: 2.787 secs ~~~ 可以看出先执行compile,然后是test。那么如果我倒过来呢? ~~~ D:\GRADLE~2\0109>gradle test compile :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE :compile1 nihao BUILD SUCCESSFUL Total time: 2.819 secs ~~~ 还是这样的顺序,因为这个是gradle自带的任务,肯定要按严格的顺序执行。所以没有说服力,我们现在写一个自己的。 build.gradle ~~~ apply plugin:'java' task test1<<{ &nbsp;&nbsp; &nbsp;println "test1" } task compile1 <<{ &nbsp;&nbsp; &nbsp;println "compile1" } ~~~ 这个时候按不同的顺序执行一下 ![](https://box.kancloud.cn/2016-01-07_568e4665ef73f.jpg) 这下验证了上面的说法,确实是按照输入的顺序执行的。 ## 2.依赖任务 其实刚才我们让test先执行,compile后执行的时候已经可以看出,gradle会将命令行中列举的任务的依赖任务也执行了。不然先执行test肯定会报错了,就是因为test任务依赖于compile等任务,所以我们执行test任务的时候,它的依赖任务会先被执行,然后才执行test任务,命令行的输出看的很明显。 而且被依赖的任务只会被执行一次。 ~~~ task compile1 <<{ println 'compiling source' } task compileTest1(dependsOn:compile1) <<{ println 'compiling unit tests' } task test1(dependsOn:[compile1,compileTest1])<<{ println 'running unit tests' } task dist1(dependsOn:[compile1,test1])<<{ println 'build the distribution' } ~~~ 看上面的例子,dist1依赖compile1和test1。然后test1又依赖compile1和compileTest1。疏导一下关系 dist1依赖:compile1、compileTest1 test1依赖:compile1、compileTest1 依据执行的顺序与命令行的列举顺序有关,且被依赖的任务只会被执行一次的这两个原则,思考一下输出应该是什么样子。 我的猜测是: ~~~ compiling source ~~~ ~~~ compiling unit tests ~~~ ~~~ running unit tests ~~~ ~~~ build the distribution ~~~ 看看对不对 ![](https://box.kancloud.cn/2016-01-07_568e466614ae5.jpg) 还好,蒙对了。 ## 3.排除任务 gradle提供了排除某个特定任务的语法,不执行所依赖的任务中的某个任务,来看一下命令 ~~~ gradle task1 -x task2 ~~~ 在执行task1任务时不执行task1所依赖的task2任务。而且只删除task2有依赖,而task1没有依赖的任务。 同样我们来看看执行下面的命令 ~~~ gradle -q dist1 -x test1 ~~~ 考虑一下执行的结果。我自己先猜一下,刨除test1中的两个依赖项目。就剩下了 ~~~ compiling source ~~~ ~~~ build the distribution ~~~ 验证一下 ![](https://box.kancloud.cn/2016-01-07_568e466628d8c.jpg) ## 4.倔强的构建方式 默认情况下,gradle在构建过程中遇到错误会自动停止,这样有些错误你无法一次性发现。但是你也可以去设置:即使遇到错也要倔强的构建,不撞南墙不回头。 这样的话等执行完毕后,再把所有的错误都打印出来,是不是很好呢。使用--continue属性。(这块还不太清楚怎么使用,以后知道了再补充) ## 5.智能匹配 执行任务的时候,任务名不需要写全,但是得能够匹配唯一一个。 ~~~ task compile1 <<{ println 'compiling source' } task compileTest1 <<{ println 'compiling unit tests' } task test1<<{ println 'running unit tests' } task dist1<<{ println 'build the distribution' } task dist2 <<{ println 'dist2' } ~~~ 例如上面的任务,我们可以通过comile匹配compile1。但是dist就不能匹配dist1,因为还有一个dist2也匹配。执行的情况如下: ![](https://box.kancloud.cn/2016-01-07_568e4666397f9.jpg) 对于有2个单词组成的任务名,我们可以通过首字母的缩写匹配该任务。 ![](https://box.kancloud.cn/2016-01-07_568e466656967.jpg) ## 6.选择特定的文件去执行 比如我们去执行同目录下sob目录下的的user.gradle构建文件。sob/user.gradle文件内容如下 ~~~ task hello<<{ println "using build file '$buildFile.name' in '$buildFile.parentFile.name'" } ~~~ 执行该文件 ~~~ D:\GRADLE~2\0109>gradle -q -b sob/user.gradle hello using build file 'user.gradle' in 'sob' ~~~ 可以看出要在命令行上用-b 后面跟目录来表示指定的文件。任务在前或在后效果都是一样的。 ~~~ D:\GRADLE~2\0109>gradle -q hello -b sob/user.gradle using build file 'user.gradle' in 'sob' ~~~