gradle构建脚本

gradle构建脚本

gradle构建脚本文件用来处理两件事情,一个是项目另一个就是任务。

每个gradle生成表示一个或多个项目,一个项目表示一个JAR库或web应用程序,也可能表示由其他项目产生的JAR文件组装的zip。

简单的说:一个项目是由不同的任务组成。一个任务是指构建的一块工作,任务可能是编译一些类,创建一个JAR,产生Javadoc或发布一些归档文件。

编写构建脚本

gradle提供了一个域特定语言DSL,用于描述构建,它使用·Groovy语言,使其更容易形容和构建。gradle中的么一个构建脚本使用UFT8进行编码,并命名为build.gradle。

创建build.gradle

我先在E盘创建一个安放gradle脚本的文件夹。E:projectgradle。

脚本中定义一个任务名称hello,脚本名为build.gradle,内容如下。

task hello{
    doLast{
        println 'hello world'
    }
}

然后在该目录下执行gradle -q 任务名

gradle -q hello

image-20201114222359208

并且在该目录下生成了.gradle文件夹:

循环:相当于从0打印到3

image-20201114222729274

输出:

image-20201114222805105

继续修改脚本:我去掉了hello任务中的doLast块,并且在hello任务前添加了一个新的world任务。

image-20201114223100899

执行:gradle -q world

image-20201114223223789

build的三个阶段

  • initialization:gradle支持单个或多个工程的构建,在构建阶段,gradle决定哪些工程参与到当前构建过程,并为每一个这一样的工程创建一个project实例,一般情况下,参与构建的工程信息将在setting.gradle中定义。
  • configuration:在这一阶段,配置project的实例,所有工程的构建脚本都将被执行。Task,configuration和其他的对象都将被创建和配置。
  • execution:在之前的配置阶段,task的一个子集被创建并配置,这些子集来自于作为参数传入gradle命令的task名字,在execution阶段,这一子集将依次被执行。

doLast在execution阶段执行,没写doLast的在configuration这一阶段完成。

例如,下面的脚本:

image-20201114224225560

image-20201114224212640

image-20201114224344391

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

image-20201114225212977

在一个文件中可以同时存在java语法、gradle语法、scala语法。

我没学过scala,这里不再演示。

任务

任务依赖

第一种

这里world任务依赖hello,所以我们执行world时,会先执行hello

task hello{
	doLast{
		println 'hello'
	}
}

task world(dependsOn:hello){
	doLast{
		println 'world'
	}
}

image-20201115112719021

第二种

此外,任务之间依赖也可以这样写:

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'
	}
}

image-20201115113557079

循环依赖

task hello(dependsOn:world){
	doLast{
		println 'hello'
	}
}

task world(dependsOn:hello){
	doLast{
		println 'world'
	}
}

会报错!所以任务之间不能相互依赖。

image-20201115112850597

向任务添加描述

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'
	}
}

image-20201115114327638

原文地址:https://www.cnblogs.com/wwjj4811/p/13975128.html