前言
Gradle是以 Groovy 语言为基础,基于DSL(领域特定语言)面向Java 应用的构建工具。Gradle让不可能变成可能,让构建更优雅、更容易。Gradle官网
为什么使用 Gradle
常见的构建工具有Ant、maven等。但它们都有一些缺点:
Ant的缺点
依赖管理较弱,很容易变臃肿, XML作为构建脚本Maven的缺点
比较精简,但限制性太多,编写插件扩展麻烦,XML作为构建脚本。
而Gradle可以说是集大成者,比Ant 语法精简, 比Maven灵活,抛弃了XML的繁琐配置,极其强大的依赖管理,基于Groovy动态语言而使得自定义行为十分方便。
Gradle
Gradle是什么
Gradle是基于Groovy定义了一套DSL,所谓DSL(领域专用语言),就是专门针对某一特定问题的计算机语言。而Gradle我们可以认为是经过“定制”的Groovy,专门用于项目构建的语言。Gradle构建语言参考
要深入Gradle的话,要学的东西也不会少,但是作为普通的开发者,个人觉得把三个概念搞懂就可以了:Task,Project,Plugin
- Project
在Gradle中,每一个project,Gradle都会创建一个Project对象,并将这个对象与构建脚本相关联。也就是说Project对象与build.gradle是一对一的关系,所以你在build.gradle写的每一个配置其实就是它对应的Project对象的一个方法或者一个变量值,譬如说我们android配置项目依赖:
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
}
- Task
Task表示一些需要执行的构建任务.比如说lint检查任务。定义一个Task可以这样写:
task hello << {
println "hello"
}
看起来挺莫名其妙的吧,还是从面向对象角度去把上面代码还原一下:
task("hello").leftShift({
println "hello"
})
(1)定义一个task相当于调用了Project对象的task方法
(2)任务名是task方法的参数名
(3)<< 是Groovy的运算符重载
从上述分析可知,其实一个Task就是一个标准的Groovy函数调用
- Plugin
Gradle是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译Java有Java插件,编译Groovy有Groovy插件,编译Android APP有Android APP插件,编译Android Library有Android Library插件。举个例子,要引入Android APP插件,就需要在build.gradle引用Android APP插件:
buildscript {
repositories {
jcenter()//表示编译过程中依赖的仓库
}
dependencies {
//依赖android开发的gradle插件,groupId:artifactId:version
classpath 'com.android.tools.build:gradle:1.5.0'
}
}
//应用插件
apply plugin: 'com.android.application'
//配置插件属性
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.test"
versionCode 1
versionName "1.0.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
Gradle进阶— 自定义插件
这一点后续再研究
Android Gradle使用
从上述可以得知,Android其实就是写了两个插件:com.android.application和com.android.library,应用这两个插件就可以实现Android APP和Android Library的构建了,所以也没啥好说的,不知道怎么配置?查文档:Gradle Plugin用户指南
这里简单分享一下jenkins + Gradle 构建有用的经验:
- Build Variants(构建变种版本)
Build Type + Product Flavor = Build Variant
Android通过Build Variants可以很方便构建不同的版本,满足各种版本需求。
(1)Build Type: 构建类型,如debug,release,一般用于构建不同类型提供团队内部使用
(2)Product Flavor : 定制类型,一般用于区分渠道打包
android {
...
buildTypes {
debug{
...
}
release {
...
}
}
productFlavors {
sit{
...
}
prd{
...
}
}
}
assembleSitDebug,assemblePrdRelease
使用Gradle构建一个Java Web工程及持续集成环境Jenkins配置参考
小结
我在上述并没有对一些细节展开论述,而仅仅个人认为比较重要的点进行了阐述,是因为我觉得对于Gradle的学习,掌握理解Api很重要.