Gradle学习之书籍《Build and Test with Gradle》之chapter2:Gradle task任务

本文原创作者:http://blog.csdn.net/minimicall转载需要注明次来源

本文为读书笔记,记录性文章,所以,不会大段大段的阐述。只会一条条的总结。

1.  定义一个任务。

gradle会运行本目录下的脚本build.gradle文件。

内容:

task hello
执行:

micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_1$ gradle hello
:hello UP-TO-DATE

BUILD SUCCESSFUL

Total time: 3.707 secs
micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_1$ gradle tasks
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
dependencies - Displays all dependencies declared in root project 'e2_1'.
dependencyInsight - Displays the insight into a specific dependency in root project 'e2_1'.
help - Displays a help message
projects - Displays the sub-projects of root project 'e2_1'.
properties - Displays the properties of root project 'e2_1'.
tasks - Displays the tasks runnable from root project 'e2_1'.

Other tasks
-----------
hello

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 2.388 secs

什么东西都没做,只是定义了一个任务。空的。

接下来,定义任务里面实质性的东西。

首先,告诉大家的是,一个gradle build一般经过三个阶段。初始化(initialization),配置(conifguration),执行(execution)。

一个任务包含动作(Task Action)和配置(Task Configuration)。

2. 动作(Task Action)

task hello << {
println 'hello, world'
}
我们用 << 追加符来定义一个task的动作。当然后续你会看到有其他方法。但这个是最方便的。

micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_3$ gradle hello
:hello
hello,world

BUILD SUCCESSFUL

Total time: 4.068 secs
你看,输出了一个hello world

不过,这个追加是可以继续“追加”的。看例子:

task hello
hello << {
print 'hello, '
}
hello << {
println 'world'
}
我们分了两次来定义hello任务的动作。

结果是和第一次是一样的。

3.任务配置(Task Configuration)

看例子吧。


task initializeDatabase
initializeDatabase << { println 'connect to database' }
initializeDatabase << { println 'update database schema' }
initializeDatabase { println 'configuring database connection' }

注意最后一行,没有追加符号的。我们来看一下输出。

micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_6$ gradle initializeDatabase
configuring database connection
:initializeDatabase
comnnet to database
update database schema

BUILD SUCCESSFUL

Total time: 4.056 secs
注意输出,“configuration database connection是在:initializeData这一行之前。

所以,一个任务执行前,实会先被配置的。

配置和动作一样可以“追加”,看例子吧。

task initializeDatabase
initializeDatabase << { println 'connect to database' }
initializeDatabase << { println 'update database schema' }
initializeDatabase { print 'start configuring ' }
initializeDatabase { println 'database connection' }

执行,输出:

micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_8$ gradle initializeDatabase
start configuring
configuring database connection
:initializeDatabase
comnnet to database
update database schema

BUILD SUCCESSFUL

Total time: 3.781 secs
配置,主要是定义一些你在执行动作的时候要用到的变量,数据结构。需要说明的是,在构建工程的过程中,不管你这个任务是否会被执行,但你的配置是每次都会被执行的。所以,需要注意这点。

还是给大家看一下代码吧:

task initializeDatabase
initializeDatabase << { println 'comnnet to database'}
initializeDatabase << { println 'update database schema'}
initializeDatabase { println 'start configuring'}
initializeDatabase { println 'configuring database connection'}

task testConfigure
testConfigure << { println 'test configure action'}
testConfigure { println 'I am the Cofiguration of task testConfigure'}

输出:

micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_8$ gradle initializeDatabase
start configuring
configuring database connection
I am the Cofiguration of task testConfigure
:initializeDatabase
comnnet to database
update database schema

BUILD SUCCESSFUL

Total time: 3.751 secs

4,任务也是个对象

这部分主要是包含四个内容:

1)任务之间的依赖。depensOn

2)doFirst方法。

3)doLast方法。

4)onlyIf方法。

我直接上两个例子。给大家一个直观感受:

task setupDatabaseTests << {
	// This is the task's existing action
	println 'load test data'
}
setupDatabaseTests.doFirst {
	println 'create schema'
}
setupDatabaseTests.doFirst {
	println 'create xxxx'
}
setupDatabaseTests.doLast {
	println 'drop test data'
}
task createSchema << { println 'create database schema'}

task loadTestData(dependsOn: createSchema) << { println 'load test data'}

loadTestData.onlyIf{
	System.properties['load.data'] == 'true'
}

大家运行各自任务来测试即可。我这里贴一个onlyIf和依赖的输出

micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_9$ gradle loadTestData
:createSchema
create database schema
:loadTestData SKIPPED

BUILD SUCCESSFUL

Total time: 3.701 secs
micall@micall-ThinkPad:~/workspace/gradler_learning/gradle/e2_9$ gradle -Dload.data=true loadTestData
:createSchema
create database schema
:loadTestData
load test data

BUILD SUCCESSFUL

DefaultTask的一些属性

didwork
是否成功执行
enable,是否可以被执行,如果被设为false则它本身不执行,它依赖的任务还是会被执行的,除非那个任务也被禁止了。
path,路径。
logger,日志。

task logLevel << {
def levels = ['DEBUG',
'INFO',
'LIFECYCLE',
'QUIET',
'WARN',
'ERROR']
levels.each { level ->
logging.level = level
def logMessage = "SETTING LogLevel=${level}"
logger.error logMessage
logger.error '-' * logMessage.size()
logger.debug 'DEBUG ENABLED'
logger.info 'INFO ENABLED'
logger.lifecycle 'LIFECYCLE ENABLED'
logger.warn 'WARN ENABLED'
logger.quiet 'QUIET ENABLED'
logger.error 'ERROR ENABLED'
println 'THIS IS println OUTPUT'
logger.error ' '
}
}
输出:

$ gradle -b logging.gradle logLevel
16:02:34.883 [ERROR] [org.gradle.api.Task] SETTING LogLevel=DEBUG
16:02:34.902 [ERROR] [org.gradle.api.Task] ----------------------
16:02:34.903 [DEBUG] [org.gradle.api.Task] DEBUG ENABLED
16:02:34.903 [INFO] [org.gradle.api.Task] INFO ENABLED
16:02:34.904 [LIFECYCLE] [org.gradle.api.Task] LIFECYCLE ENABLED
16:02:34.904 [WARN] [org.gradle.api.Task] WARN ENABLED
16:02:34.905 [QUIET] [org.gradle.api.Task] QUIET ENABLED
16:02:34.905 [ERROR] [org.gradle.api.Task] ERROR ENABLED
16:02:34.906 [ERROR] [org.gradle.api.Task]
SETTING LogLevel=INFO
---------------------








上一篇:手写快速排序(JavaScript)


下一篇:anaconda conda 切换为国内源 、windows 和 Linux配置方法、 添加清华源——【一文读懂】