本文首发于微信公众号「刘望舒」
原文连接:Gradle入门前奏html
在上一篇文章Android Gradle(一)为何如今要用Gradle?中,咱们学习了常见的构建工具,以及Gradle与这些构建工具相比有那些不一样的特性。这一篇文章咱们接着来学习Gradle入门须要掌握的知识,包括配置环境、实现Hello World、Gradle的任务、Gradle日志和Gradle命令行,掌握这些可以更好的理解Gradle。前端
安装Gradle前要确保系统已经配置好JDK的环境,要求JDK的版本在1.7或更高。 Gradle的安装有两种形式:java
关于包管理器安装能够查看官方文档 ,这里主要介绍手动安装,在https://gradle.org/releases/中下载你想要Gradle版本的binary-only。api
和配置Java环境相似,在系统变量中添加GRADLE_HOME: bash
步骤以下:微信
export PATH=$PATH:~/develop/gradle-4.10.1/bin
复制代码
配置完Gradle环境后,按照惯例要实现Gradle的Hello World,这里以Windows平台为例。 build.gradle为Gradle默认的构建脚本文件,运行Gradle 命令时,会从当前目录下寻找 build.gradle 文件来执行构建。 咱们先新建一个目录,好比D:\Android\gradle_demo,在这个目录中新建一个 build.gradle 文件,输入如下内容:app
task hello {
doLast {
println 'Hello world!'
}
}
复制代码
而后在该文件所在目录下运行gradle -q hello构建脚本, 就会打印出“Hello world!”。ide
项目构建比较复杂,为了使用各类开发语言的开发者都可以快速的构建项目,专家们开发出了Gradle这个基于Groovy的DSL,DSL(Domain Specifc Language)意为领域特定语言,只用于某个特定的领域。咱们只要按照Groovy的DSL语法来写,就能够轻松构建项目。 task(任务)和action(动做)是Gradle的重要元素。上面的代码中,task表明一个独立的原子性操做,好比复制一个文件,编译一次Java代码,这里咱们简单的定义一个名为hello的任务。doLast 表明task执行的最后一个action,通俗来说就是task执行完毕后会回调doLast中的代码,在上面这个例子中就会打印 'Hello world!'工具
上面的例子还能够写的更简洁一些,操做符<< 是doLast方法的快捷版本,它们作了相同的事情,以下所示。oop
task hello << {
println 'Hello world!'
}
复制代码
为了更好的讲解后面的Gradle 命令行,这里简单的介绍下Gradle的任务,包括建立任务、任务依赖、 动态定义任务和任务的分组和描述。
除了第2节实现Hello World的例子采用的建立任务方式,还有其余的3种建立任务方式。 1.直接用任务名称建立。
def Task hello=task(hello)
hello.doLast{
println "hello world"
}
复制代码
2.任务名称+任务配置建立。
def Task hello=task(hello,group:BasePlugin.BUILD_GROUP)
hello.doLast{
println "hello world"
}
复制代码
其中group为任务配置项,它表明了分组,关于分组具体见3.4小节。
3.TaskContainer的create方法建立。
tasks.create(name: 'hello') << {
println "hello world"
}
复制代码
此前建立任务的方式最终都会调用tasks的create方法,其中tasks类型为TaskContainer。
任务依赖会决定任务运行的前后顺序,被依赖的任务会在定义依赖的任务以前执行。建立任务间的依赖关系以下所示。
task hello << {
println 'Hello world!'
}
task go(dependsOn: hello) << {
println "go for it"
}
复制代码
在hello任务的基础上增长了一个名为go的任务,经过dependsOn来指定依赖的任务为hello,所以go任务运行在hello以后。 运行gradle -q go构建脚本,打印结果以下: Hello world! go for it
动态定义任务指的是在运行时来定义任务的名称,以下所示。
3.times {number ->
task "task$number" << {
println "task $number"
}
}
复制代码
这里用到了Groovy语法,关于Groovy语法会在本系列后续的文章进行介绍。times是Groovy在java.lang.Number中拓展的方法,是一个定时器。3.times中循环建立了三个新任务,隐式变量number的值为0,1,2,任务的名称由task加上number的值组成,达到了动态定义任务的目的。 运行gradle -q task0构建脚本,打印结果以下: task 0
Gradle有任务组的概念,能够为任务配置分组和描述,以便于更好的管理任务,拥有良好的可读性。改造3.2小节的例子,为hello任务添加分组和描述。
task hello {
group = 'build'
description = 'hello world'
doLast {
println "任务分组: ${group}"
println "任务描述: ${description}"
}
}
task go(dependsOn: hello) << {
println "go for it"
}
复制代码
也能够采用3.1小节中其余的建立任务方式来为任务添加分组和描述,以下所示。
def Task hello=task(hello)
hello.description ='hello world'
hello.group=BasePlugin.BUILD_GROUP
hello.doLast{
println "任务分组: ${group}"
println "任务描述: ${description}"
}
task go(dependsOn: hello) << {
println "go for it"
}
复制代码
和Android同样,Gradle也定义了日志级别。
前面咱们经过gradle -q +任务名称来运行一个指定的task,这个q是命令行开关选项,经过开关选项能够控制输出的日志级别。
从命令行的角度,Gradle和Git相似,命令均可以用一些IDE、图形工具来代替,可是若是你对Gradle 命令行熟悉,会帮助你更好的理解Gradle,高效的运用Gradle。
这一节的命令行以3.4小节的代码为例,此前咱们经过gradle -q +任务名称来运行一个指定的任务,若是不知道任务的名称,能够 经过运行gradle -q tasks命令来获取全部的任务信息,这样就不须要打开源码了。
Build tasks
-----------
hello - hello world
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root projec
t 'gradle_demo'.
components - Displays the components produced by root project 'gradle_demo'. [in
cubating]
dependencies - Displays all dependencies declared in root project 'gradle_demo'.
dependencyInsight - Displays the insight into a specific dependency in root proj
ect 'gradle_demo'.
dependentComponents - Displays the dependent components of components in root pr
oject 'gradle_demo'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gradle_demo'. [incubat
ing]
projects - Displays the sub-projects of root project 'gradle_demo'.
properties - Displays the properties of root project 'gradle_demo'.
tasks - Displays the tasks runnable from root project 'gradle_demo'.
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>
复制代码
默认状况下,只会显示那些被分组的任务的名称和描述。好比Build tasks(Build 任务组)中有咱们定义的hello任务,Build Setup tasks中有init和wrapper,Help tasks有buildEnvironment 和components等等。
若是咱们不想运行go任务,能够运行gradle hello -x go命令:
> Task :hello
任务分组: build
任务描述: hello world
Deprecated Gradle features were used in this build, making it incompatible with
Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.10.1/userguide/command_line_interface.html#sec:com
mand_line_warnings
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
复制代码
能够看出,并无运行go任务。
经过运行gradle -q help --task hello命令来显示hello任务的帮助信息。
Detailed task information for hello
Path
:hello Type Task (org.gradle.api.Task) Description hello world Group build 复制代码
能够看到hello任务的路径、类型、描述和分组。
task helloWorld << {
println 'Hello world!'
}
task goForit<< {
println "go for it"
}
复制代码
经过命令行一次执行多个任务,每一个任务一般只会执行一次,不管是在命令行中指定任务仍是任务依赖,上面的例子咱们运行gradle helloWorld goForit,会先执行helloWorld任务后执行goForit任务。
能够对使用驼峰命名的任务进行缩写,对于名称特别长的任务这个特性很是有用,好比5.4小节中的例子只须要执行gradle hW gF 就能够了,不过须要注意一点,那就是任务名称的缩写必须是惟一的,若是5.4小节中第二个任务的名称为helloWangshu,那么就会报错。
分享Android、Java和大前端相关技术