gradle构建工具学习系列
假如想通过两个task扩展版本管理功能:一个用来增加项目的主版本,另一个用于增加项目的次版本,它们的实现如下所示
task incrementMajorVersion(group: 'versioning', description: 'Increments project major version.') << {
String currentVersion = version.toString()
++version.major
String newVersion = version.toString()
logger.info "Incrementing major project version: $currentVersion -> $newVersion"
ant.propertyfile(file: versionFile) {
entry(key: 'major', type: 'int', operation: '+', value: 1)
}
}
task incrementMinorVersion(group: 'versioning', description: 'Increments project minor version.') << {
String currentVersion = version.toString()
++version.minor
String newVersion = version.toString()
logger.info "Incrementing minor project version: $currentVersion -> $newVersion"
ant.propertyfile(file: versionFile) {
entry(key: 'minor', type: 'int', operation: '+', value: 1)
}
}
两个独立的task工作其实基本大同小异,完全可以在一个方法中实现。在Gradle当中引入了task规则的概念,根据task名称模式执行特定的逻辑,该模式由两部分组成:task名称的静态部分和一个占位符,联合起来组成了一个动态的task名称。如果你想将task规则应用于前面的例子中,那么命名看起来应该是: incrementVersion 。在命令行执行这个task,将以驼峰命名法指定类别占位符,比如incrementMajorVersion或者incrementMinorVersion。
声明task规则Gradle的一些核心插件充分的利用了task规则,Java插件定义的task规则之一是clean,用来删除指定task的输出。比如,在命令行运行gradle cleanCompileJava会删除所有产品代码的class文件
为了给项目添加task规则,首先需要获得对TaskContainer的引用,一旦拥有了这个引用,就可以调用addRule方法了。分别如下图所示
这个方法包含有两个引用,第一个参数提供了描述信息(比如,task命名模式),第二个参数声明了要执行的闭包来引用规则。代码如下所示
tasks.addRule("Pattern: incrementVersion – Increments the project version classifier.") { String taskName ->
if (taskName.startsWith('increment') && taskName.endsWith('Version')) {
task(taskName){
doLast {
String classifier = (taskName - 'increment' - 'Version').toLowerCase()
String currentVersion = version.toString()
switch (classifier) {
case 'major': ++version.major
break
case 'minor': ++version.minor
break
default: throw new GradleException("Invalid version type '$classifier. Allowed types: ['Major', 'Minor']")
}
String newVersion = version.toString()
logger.info "Incrementing $classifier project version: $currentVersion -> $newVersion"
ant.propertyfile(file: versionFile) {
entry(key: classifier, type: 'int', operation: '+', value: 1)
}
}
}
}
}
在项目中添加task规则之后,你会发现当运行gradle tasks时会列出一个具体的task组Rules:
task规则不能像处理其他的简单的task或增强的task一样被独立分组。task规则即使通过插件声明了,它也将永远显示在Rules组下。



