1.构建脚本基础

Posted Young_xiaoT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.构建脚本基础相关的知识,希望对你有一定的参考价值。

转载整理自Gradle User Guide 中文版

构建脚本基础

1. project 和 tasks

Gradle里的任何东西都是基于这两个概念:

  • projects(项目)
  • tasks(任务)

每一个构建都是由一个或多个projects构成的。一个project代表什么依赖于你想用Gradle做什么,一个project可以代表一个JAR、一个网页应用或者一个ZIP压缩包。这个ZIP可能是由许多其他项目JARs构成的。但是一个project不一定非要代表被构建的某个东西,它可以代表一件想要做的事,比如部署应用。

每一个project 是由一个或多个tasks构成的。一个tasks代表一些更加细化的构建,可能是编译一些classes,创建一个JAR,生成javadoc,或者是生成某个目录的压缩文件。

2. Hello World

可以通过gradle命令运行一个Gradle构建。

gradle命令会在当前目录查找一个叫build.gradle的文件,我们称这个build.gradle文件为一个构建脚本(build script),但严格来说它是一个构建配置脚本(build configuration scrip)。这个脚本定义了一个project和它的tasks。


创建一个名为build.gradle的构建脚本

build.gradle

task hello 
  doLast
    println 'hello world!'
  

输入 gradle -q hello 来执行构建脚本:

gradle -q hello 的输出

> gradle -q hello
 hello world!

这个构建脚本定义了一个独立的tasks,叫做hello,并且加入了一个action,当运行gradle hello,Gradle执行叫hello的task,也就是执行了提供的action。这个action是一个包含了一些Groovy代码的闭包(closure)

-q 代表quite模式 ,它不会生成Gradle的日志信息(log messages),只能看到tasks的输出。

3. 快捷的任务定义

build.gradle

task hello2 << 
  println 'Hello World!'

与前面的例子比较,doLast被替换成了 << ,他们有一样的功能,但看上去更加简洁了。

4. 构建脚本代码

eg:
build.gradle

task upper << 
    String someString = 'mY_nAmE'
    println "Original: " + someString
    println "Upper case: " + someString.toUpperCase()

gradle -q upper 的输出

> gradle -q upper
Original: mY_nAmE
Upper case: MY_NAME

5. 任务依赖

声明任务之间的依赖关系

build.gradle

task hello << 
    println 'Hello World!'


task intro(dependsOn: hello) << 
    println "I'm Gradle"
> gradle -q intro
Hello world!
I'm Gradle

intro依赖于hello,所以执行intro的时候hello命令会被优先执行来作为启动intro任务的条件。在加入一个依赖之前,这个依赖的任务不需要提前定义。

build.gradle

task taskX(dependsOn: 'taskY') << 
    println 'taskX'

task taskY << 
    println 'taskY'
> gradle -q taskX
taskY
taskX

taskX到taskY的依赖在taskY被定义之前就已经声明了,这对于多任务构建非常重要。

6. 动态任务

Groovy不仅被用来定义一个任务可以什么,还可以使用它来动态的创建任务。

build.gradle

4.times counter ->
    task "task$counter" << 
        println "I'm task unmber $counter"
    

这里动态的创建了task0,task1,task2,task3

> gradle -q task1
I'm task number 1

7. 使用已经存在的任务

当任务创建之后,可以通过API来访问,可以创建额外的依赖。

通过API访问一个任务 - 加入一个依赖

build.gradle

4.times  counter ->
    task "task$counter" << 
        println "I'm task number $counter"
    


task0.dependsOn task2, task3

gradle -q task0 命令输出

> gradle -q task0
I'm task number 2
I'm task number 3
I'm task number 0

或者给一个已经存在的任务加入行为
通过API访问一个任务 - 加入一个行为

build.gradle

task hello << 
    println 'Hello Earth'


hello.doFirst 
    println 'Hello Venus'


hello.doLast 
    println 'Hello Mars'


hello << 
    println 'Hello Jupiter'

gradle -q hello 命令输出

> gradle -q hello
Hello Venus
Hello Earth
Hello Mars
Hello Jupiter

doFirst 和 doLast 可以被执行许多次。他们分别可以在任务动作列表的开始和结束加入动作。当任务执行的时候,在动作列表里的动作将被顺序执行。第四个行为中 << 操作符是 doLast 的简单别称。

8. 短标记法

有一个短标记 $ 可以访问一个存在的任务,也就是说每个任务都可以作为构建脚本的属性:

build.gradle

task hello << 
    println 'Hello world'


hello.doLast 
  println "Greetings from the $hello.name task."

gradle -q hello 命令输出

> gradle -q hello
Hello world!
Greetings from the hello task.

这里的name是任务的默认属性,代表当前任务的名称,这里是hello.
这使得代码易于读取,特别是当使用了由插件(如编译)提供的任务时尤其如此。

9. 自定义任务属性

可以给任务加入自定义的属性,例如加入一个叫做myProperty属性,设置一个初始值给ext.myProperty。然后,该属性就可以像一个预定义的任务属性那样被读取和设置了。

build.gradle

task myTask 
    ext.myProperty = "myValue"


task printTaskProperties << 
    println myTask.myProperty

gradle -q printTaskProperties 命令输出

> gradle -q printTaskProperties
myValue

给任务加自定义属性是没有任何限制的。

11. 默认任务

Gradle 允许在脚本中定义一个或多个默认任务

build.gradle

defaultTasks 'clean', 'run'

task clean << 
    println 'Default Cleaning!'


task run << 
    println 'Default Running!'


task other << 
    println "I'm not a default task!"

gradle -q 命令输出

> gradle -q
Default Cleaning!
Default Running!

等价于 gradle -q clean run 在一个多项目构建中,每一个子项目都可以有它特有的默认任务。如果一个子项目没有特别的默认任务,父项目的默认任务将会被执行。

以上是关于1.构建脚本基础的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 学习之基础项目脚本

Gradle 学习之基础项目脚本

1.构建脚本基础

docker基于mysql:5.7构建镜像并初始化脚本

shell脚本编程基础之for循环

Linux Bash-脚本基础