gradle学习(8)-gradle的命令行
最后更新于:2022-04-01 06:51:36
**(以下所有内容都是根据[官方文档](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<<{
println "test1"
}
task compile1 <<{
println "compile1"
}
~~~
这个时候按不同的顺序执行一下
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/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://docs.gechiui.com/gc-content/uploads/sites/kancloud/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://docs.gechiui.com/gc-content/uploads/sites/kancloud/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://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e4666397f9.jpg)
对于有2个单词组成的任务名,我们可以通过首字母的缩写匹配该任务。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/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'
~~~