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