Gradle Goodness: Working with Live Task Collection
Gradle support the definition of so called live collections. These collections are mostly created based on criteria like with a filter() or matching() method. The collection content can change if the content of the source collection changes. For example the org.gradle.api.DomainObjectCollection interface has a matching method that returns a live collection. The list of tasks in a project implements this interface so we can have a live collection of tasks that match a certain criteria.
The nice thing about the live collection of tasks is that we can add tasks to the project after we have defined the task collection and they will be included in the collection. Normally if we would access the list of tasks in a project and use for example a findAll method than the returned list of tasks will not change. So if we add a new task to the project it will not be added to the list of task that apply to the condition of the findAll method.
Now if we use the matching() method on a list of tasks the result will be a live list of tasks. Even if we add tasks to the project after the definition of the list of tasks, they will be added to the collection.
Let's see the following Gradle build file that defines the tasks allCompile and allCopy. Each task has dependencies on other tasks. We use the dependsOn() method of a task to set those dependencies. The dependsOn() method accepts a collection of other tasks. For the allCompile task we don't use a live collection and for the allCopy task we use a live collection.
00.task allCompile << {01.println 'All is compiled.'02.}03.allCompile.dependsOn project.tasks.findAll {04.it.name.startsWith('compile')05.}06. 07.task allCopy << {08.println 'Everything is copied.'09.}10.// Set dependencies with live collection of tasks.11.allCopy.dependsOn project.tasks.matching {12.it.name.startsWith('copy')13.}14. 15.// Add dependency tasks.16.5.times {17.// Dependencies for compileAll task.18.task "compile${it}" << { println 'Compile the code.' }19. 20.// Dependencies for copyAll task.21.task "copy${it}" << { println 'Copy something.' }22.}If we run the build script we get the following output:
$ gradle allCompile allCopy:allCompileAll is compiled.:copy0Copy something.:copy1Copy something.:copy2Copy something.:copy3Copy something.:copy4Copy something.:allCopyEverything is copied.BUILD SUCCESSFULTotal time: 2.232 secsWe notice the allCompile tasks doesn't have any dependencies, because those task dependencies didn't exist when we used the dependsOn() method. The allCopy task has all task dependencies even though we created them later in the build script.
Bonus: we can use the findAll method to look for task dependencies, but we have to let Gradle evaluate this condition in a closure. So we can change our build script and use a closure with the dependsOn() method. Gradle will invoke the closure at execution time and not a configuration time. The dependencies tasks are then available and assigned as dependencies to the allCompile task:
00.task allCompile << {01.println 'All is compiled.'02.}03.// Use closure for resolving task dependencies.04.allCompile.dependsOn {05.project.tasks.findAll {06.it.name.startsWith('compile')07.}08.}09. 10.task allCopy << {11.println 'Everything is copied.'12.}13.// Set dependencies with live collection of tasks.14.allCopy.dependsOn project.tasks.matching {15.it.name.startsWith('copy')16.}17. 18.// Add dependency tasks.19.5.times {20.// Dependencies for compileAll task.21.task "compile${it}" << { println 'Compile the code.' }22. 23.// Dependencies for copyAll task.24.task "copy${it}" << { println 'Copy something.' }25.}If we invoke both tasks with Gradle we get the following output:
:compile0Compile the code.:compile1Compile the code.:compile2Compile the code.:compile3Compile the code.:compile4Compile the code.:allCompileAll is compiled.:copy0Copy something.:copy1Copy something.:copy2Copy something.:copy3Copy something.:copy4Copy something.:allCopyEverything is copied.BUILD SUCCESSFULTotal time: 2.258 secsThis blog post is based on Gradle version 1.0-rc-3
Gradle Goodness: Working with Live Task Collection的更多相关文章
- Gradle Goodness: Task Output Annotations Create Directory Automatically
Gradle Goodness: Task Output Annotations Create Directory Automatically One of the great features of ...
- Gradle Goodness: Copy Files with Filtering
Gradle Goodness: Copy Files with Filtering Gradle's copy task is very powerful and includes filterin ...
- Gradle Goodness: Init Script for Adding Extra Plugins to Existing Projects
Gradle Goodness: Init Script for Adding Extra Plugins to Existing Projects Gradle is very flexible. ...
- Gradle Goodness: Group Similar Tasks
In Gradle we can assign a task to a group. Gradle uses the group for example in the output of $ grad ...
- Gradle Goodness: Add Incremental Build Support to Tasks
Gradle has a very powerful incremental build feature. This means Gradle will not execute a task unle ...
- Gradle Goodness: Rename Ant Task Names When Importing Ant Build File
Migrating from Ant to Gradle is very easy with the importBuild method from AntBuilder. We only have ...
- Gradle Goodness: Parse Files with SimpleTemplateEngine in Copy Task
With the copy task of Gradle we can copy files that are parsed by Groovy's SimpleTemplateEngine. Thi ...
- Gradle Goodness: Check Task Dependencies With a Dry Run
We can run a Gradle build without any of the task actions being executed. This is a so-called dry ru ...
- Gradle Goodness: Using and Working with Gradle Version
To get the current Gradle version we can use the gradleVersion property of the Gradle object. This r ...
随机推荐
- 【原创】MapReduce程序如何在集群上执行
首先了解下资源调度管理框架Yarn. Yarn的结构(如图): Resource Manager (rm)负责调度管理整个集群上的资源,而每一个计算节点上都会有一个Node Manager(nm)来负 ...
- 建造者(生成器)模式C++、Java实现
1.建造者模式UML 图1. 建造者模式UML 2.C++实现 C++实现类视图: 图2. 建造者模式C++实现的类视图 其中,Product的实现代码是(ProductA和ProductB的代码不再 ...
- RegExp.prototype.exec()使用技巧
RegExp.prototype.exec() exec() 方法在一个指定字符串中执行一个搜索匹配.返回一个结果数组或 null. 如果你只是为了判断是否匹配(true或 false),可以使用 R ...
- NodeJS require路径
项目需要用nodejs,感觉nodejs是前端装逼神器了,是通向全栈工程师的必经之路哇,接下来开始踏上学习nodejs的征程.下面是第一个hello,world的程序. 1.server.js文件,这 ...
- java idea+ssm框架遇到的问题
0.学习教程 http://www.cnblogs.com/jiekzou/p/9205117.html https://github.com/crossoverJie/SSM 1.gradle没刷新 ...
- php注册
<?php var_dump($_GET);//打印出对象的数据类型//链接数据库$link = @mysql_connect('localhost','root','root');#选择数据库 ...
- 4 关于word2vec的skip-gram模型使用负例采样nce_loss损失函数的源码剖析
tf.nn.nce_loss是word2vec的skip-gram模型的负例采样方式的函数,下面分析其源代码. 1 上下文代码 loss = tf.reduce_mean( tf.nn.nce_los ...
- 安装busybox玩玩
到http://www.busybox.net/downloads/binaries/下载放到sdcard然后adb shellsumount -o remount,rw -t yaffs2 /dev ...
- qwewq
- Unable to create a constant value of type 'System.Object'. Only primitive types or enumeration types are supported in this context.
代码如下: var query = from s in db.LoginUserServices join ss in db.Services on s.ServiceType equals ss.C ...