gradle构建脚本
gradle构建脚本文件用来处理两件事情,一个是项目另一个就是任务。
每个gradle生成表示一个或多个项目,一个项目表示一个JAR库或web应用程序,也可能表示由其他项目产生的JAR文件组装的zip。
简单的说:一个项目是由不同的任务组成。一个任务是指构建的一块工作,任务可能是编译一些类,创建一个JAR,产生Javadoc或发布一些归档文件。
编写构建脚本
gradle提供了一个域特定语言DSL,用于描述构建,它使用·Groovy语言,使其更容易形容和构建。gradle中的么一个构建脚本使用UFT8进行编码,并命名为build.gradle。
创建build.gradle
我先在E盘创建一个安放gradle脚本的文件夹。E:\project\gradle。
脚本中定义一个任务名称hello,脚本名为build.gradle,内容如下。
task hello{
doLast{
println 'hello world'
}
}
然后在该目录下执行gradle -q 任务名
gradle -q hello
并且在该目录下生成了.gradle文件夹:
循环:相当于从0打印到3
输出:
继续修改脚本:我去掉了hello任务中的doLast块,并且在hello任务前添加了一个新的world任务。
执行:gradle -q world
build的三个阶段
- initialization:gradle支持单个或多个工程的构建,在构建阶段,gradle决定哪些工程参与到当前构建过程,并为每一个这一样的工程创建一个project实例,一般情况下,参与构建的工程信息将在setting.gradle中定义。
- configuration:在这一阶段,配置project的实例,所有工程的构建脚本都将被执行。Task,configuration和其他的对象都将被创建和配置。
- execution:在之前的配置阶段,task的一个子集被创建并配置,这些子集来自于作为参数传入gradle命令的task名字,在execution阶段,这一子集将依次被执行。
doLast在execution阶段执行,没写doLast的在configuration这一阶段完成。
例如,下面的脚本:
jdk语法支持
我们甚至可以在gradle中使用jdk的api以及一些语法.
task hello{
List<String> strs = Arrays.asList("aa","bb");
for(String str : strs){
System.out.println(str);
}
Map<Integer,String> map = new HashMap<>();
map.put(1,"a");
map.put(3,"b");
for(Integer key:map.keySet()){
System.out.println("key:"+key);
println 'value:'+map.get(key)
}
println 'hello world'
}
执行:gradle -q hello
在一个文件中可以同时存在java语法、gradle语法、scala语法。
我没学过scala,这里不再演示。
任务
任务依赖
第一种
这里world任务依赖hello,所以我们执行world时,会先执行hello
task hello{
doLast{
println 'hello'
}
}
task world(dependsOn:hello){
doLast{
println 'world'
}
}
第二种
此外,任务之间依赖也可以这样写:
task hello{
doLast{
println 'hello'
}
}
task world{
doLast{
println 'world'
}
}
world.dependsOn hello
第三种
task hello{
doLast{
println 'hello'
}
}
hello.dependsOn{
tasks.findAll{
task-> task.name.startsWith('world')
}
}
task world1{
doLast{
println 'world1'
}
}
task world2{
doLast{
println 'world2'
}
}
循环依赖
task hello(dependsOn:world){
doLast{
println 'hello'
}
}
task world(dependsOn:hello){
doLast{
println 'world'
}
}
会报错!所以任务之间不能相互依赖。
向任务添加描述
task world2{
description 'this is world2'
doLast{
println 'world2'
}
}
跳过任务
我们可以抛出StopExecutionException异常,来跳过当前任务,但是不影响下一步任务的执行。
task hello{
doLast{
println 'hello'
}
}
/**在执行hello任务之前,先执行这块,但是抛出这个异常,hello任务将不执行**/
hello.doFirst{
throw new StopExecutionException()
}
task world(dependsOn: hello){
doLast{
println 'world'
}
}