Gradle 构建块
基本模块project、task、property。
Project接口描述
代表一个正在构建的组件,如jar文件,或者一个目标,如部署应用程序。构建进程启动后Gradle基于build.gradle配置实例化Project类,其API接口及其重要方法如下:[org.gradle.api.Project]
构建脚本配置
apply(options:Map)
buildscript(config:Closure)
依赖管理
dependencies(config:Closure)
configurations(config:Closure)
getDependencies()
getConfigrations()
getter/setter属性
ant
name
description
group
path
version
logger
创建文件
file(path:Object)
file(path:Object...)
fileTree(baseDir:Object)
创建task
task()
任务接口task
任务动作和任务依赖
Task接口描述 org.gradle.api.Task,代表一个执行的任务。
task依赖
dependsOn(tasks:Object…)
动作定义
doFirst(action :Closure)
doLast(action:Closure)
getActions()
输入输出数据声明
getInputs()
getOutputs()
getter和setter属性
getAnt()
getDescription()
getEnabled()
getGroup()
setDescription(description:String)
setEnabled(setabled:boolean)
setGroup(group:String);
属性:任务或项目的描述,如何扩展属性呢,属性以k-v形式存储,添加属性需要使用ext命名空间。
project.ext.myPro= 'myValue'
ext{
name = 'zhao';
age = 11;
}
当然Gradle属性可以通过gradle.properites文件中声明直接添加到项目。
一般位于/.gradle 或者项目根目录下。
前面的方式大多用来声明自定义变量,Gradle也提供了很多其他方式为构建提供属性,例如:
项目属性通过-P 命令行选项提供
系统属性通过-D 命令行选项提供
环境属性可以参考如下模式提供
ORG_GRADLE_PROJECT_myproper=myValue
task动作
action是在task中合适的地方放置构建逻辑,Task提供了两个相关的方法来声明task动作,doFirst(Closure)和doLast(Closure),当task被执行,动作逻辑被定义为闭包参数被依次执行。
Gradle 构建生命周期阶段
任何时候执行Gradle构建,都会运行三个不同的生命周期阶段:
初始化
gradle为项目创建Project实例
配置
gradle构造了模型来表示任务,并参与到构建中,增量式构建特性决定了模型中的task是否需要被运行,每一次构建,任何配置代码都被执行。
执行
task安装依赖被一次执行。
声明task的inputs和outputs
通过这两个属性,来决定任务是否是最新的。
task的inputs和outpus是在配置阶段执行的用来连接task依赖。这就需要在配置块中被定义的原因,确保inputs和outputs的值在配置期是可以访问的。若需要编程获得输出,那么可以通过TaskOutputs上的upToDateWhen(Closure)方法来实现,与常规的inputs和outputs相比,这个方法是在执行期间执行。若闭包返回true,则task会被认为是最新的。
通过version的属性文件,读取项目版本
```
task printVersion1{
doLast{
group='version'
description='print version'
// version = new ProjectVersion(1,0,true);
logger.quiet "Version $version";
}
}
class ProjectVersion{
Integer major;
Integer minor;
Boolean release;
ProjectVersion(Integer ma,Integer mi,Boolean rel){
this.major=ma;
this.minor=mi;
this.release = rel;
}
String toString(){
"$major . $minor $release";
}
}
ext{
versionFile=file('version.properties');
}
ProjectVersion readVersion(){
logger.quiet 'read version from version.properties';
if(!versionFile.exists()){
throw new Exception("version.proversion not exists");
}
Properties properties = new Properties()
versionFile.withInputStream{
stream ->
properties.load(stream);
}
new ProjectVersion(properties.major.toInteger(),properties.minor.toInteger(),properties.release.toBoolean());
}
task loadVersion{
project.version=readVersion();
}
//通过ant操作属性文件
task makeRelease{
inputs.property('release',version.release);
outputs.file versionFile;
doLast(){
version.release=true;
ant.propertyfile(file:versionFile){
entry(key:'release',type:'string',operation:'=',value:'true');
}
}
}
```