发现一个讲解gradle的博客,在此做一下记录并推荐出来:
Gradle学习系列
在之前的博客中,对gradle的基本用法做了简单的了解,并使用gradle的核心插件构建了一个完整的javaweb项目,如果只是使用插件的默认约定,采用插件提供的标准构建,和使用插件提供的标准task,那么已经可以在新的项目中大胆使用gradle了。
但是如果想要发挥gradle的各种优势,灵活的使用gradle,真正把项目自动化落地,那么深入了解部分gradle的原理是必不可少的,就如同我们学习spring时不仅需要按部就班学习spring的配置,同时需要明白spring的部分原理。
在接下来的学习中博主会对gradle的基本原理进行学习
构建块(building block)
每个gradle构建都包含三个基本构建块:
- project
每个构建都至少包含一个project,多项目构建包含多个project和它们之间的依赖 - task
task被包含在project中,准确的说被包含在project的TaskContainer中,可以通过调用下面的方法来获得该project的TaskContainer
- property
每一个project和task的实例中都有一些property。
项目(project)
- 项目代表一个正在构建的组件,每个构建脚本至少定义一个项目,当构建进程启动后,Gradle基于build.gradle中的配置实例化org.gradle.api.Project接口,并且通过project引用这个实例。
- 一个project可以创建新的task,添加依赖关系和配置,应用插件和其他的构建脚本它的property可以使用显示或隐式的getter和setter来访问,在当前的构建脚本中访问当前project属性和方法时,不需要通过project引用来调用。
任务(task)
- 在project中创建task,实际上是调用了Project实例的task方法,以下面的例子来说明:
task printVersion(group: 'versioning',description:'print current version'){
logger.quiet "Version:$version"
}
上面的代码创建了一个名字为printVersion的task,并且设置了printVersion的属性
group和description的值。这段代码等价于下面的代码:
task ([group: 'versioning',description:'print current version'],'printVersion',{
logger.quiet "Version:$version"
})
实际上都是调用了这个方法
调用task方法,gradle会实例化一个org.gradle.api.Task接口的对象,默认使用org.gradle.api.DefaultTask类型,然后将该对象保存在所属的project对象的taskContainer的属性中。
- 任务在创建后不可以重复创建,但是可以再次调用该任务往里面补充内容,例如在上面的任务定义好之后,可以追加一行输出:
printVersion{
println "END printVersion"
}
- 另外还可以定义任务间的依赖关系。
属性(property)
- 在Project和Task构建块中可以访问对应实例的属性(Task中也可以访问Project的属性)
- gradle允许用户通过拓展属性来新增自定义的属性
添加属性需要使用ext命名空间
ext{
someOtherProp = 123
}
或者
ext.someOtherProp = 123
属性不仅可以在脚本代码中声明,也可以通过属性文件来提取
- gradle全局属性
gradle全局属性可以通过在gradle.properties文件中声明直接添加到项目中,这个文件位于<USER_HOME>/.gradle
目录下。在这个属性文件中声明的属性对所有的项
目可用,比如直接在该文件末尾追加:
someOtherProp=123
- 声明属性的其他方式
- 项目属性通过-P命令行选项提供
- 系统属性通过-D命令行选项提供
- 环境属性按照下面的模式提供
ORG_GRADLE_PROJECT_propertyName=someValue
更多的属性添加方式欲更详细的介绍请移步:gradle-userguide,搜索proper*即可。