本文原创作者: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
---------------------