Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.3——排除任务

问题:

你想要在构建进程当中排除指定的任务。

解决方案:

可以使用-x排除单个任务。编辑task graph排除多个任务。

讨论:

Gradle的构建进程包含了许多任务的执行顺序。他们中的大多数都依赖于进程中之前执行的任务,但是也有些在时间紧张的时候也可以被排除。

举个例子,lint任务对判断你的项目和google推荐的APP实践有多少差距,但是没必要每次都执行。

在Gradle中使用-x标志(--exclude-task的缩写)排除一个任务。因此使用这个flag跳过lint任务(或者其它你不想要的任务),如下:

./gradlew build -x lint

这个排除了lint任务和所有依赖它的任务。任何需要它的任务也不会运行,所以确定拟派出的任务不会在后面的进程当中被需要。

唯一的问题是如果你的项目包含多个variants,每个任务都有一个lint任务。理论上你可以手动的排除,但是你更希望在build里面排除。

当Gradle运行的时候,集合了一个有向非循环图(DAG),task的图表。你可以通过gradle对象在build文件里面得到参考。任何对graph的修改都必须在它形成之后,所以你需要在应用任何改变之前使用whenReady属性。

结果就是如可以像下面这样在build文件里面写代码:

gradle.taskGraph.whenReady { graph ->
    graph.allTasks.findAll { it.name ==~ /lint.*/ }*.enabled = false
}

task graph的allTasks属性使用Groovy风格引用getAllTasks方法。这个返回tasks的java.util.List。Groovy在List里面增加了一个findAll方法,可以只返回满足提供的闭包的任务。在这种情况下,闭包表示遍历所有任务的name属性,并且坚持他们是否符合正则表达式。使用“spread-dot”操作符将列表中的所有任务无效。

结果就是所有以小写letters开头的任务,它们的enabled属性都置false,所有它们都不会执行。

有时候你不想排除所有lint任务,你可以在这么做之前检查项目属性是否被设置:

gradle.taskGraph.whenReady { graph -> 
  if (project.hasProperty('noLint')) {
      graph.allTasks.findAll { it.name ==~ /lint.*/ }*.enabled = false
  }
}

你可以在命令行使用-P设置project属性,如下:

这个涉及到大量的Groovy只是,但是在修改task graph是非常强大的。

posted @ 2017-02-20 23:26  tootwo2  阅读(254)  评论(0编辑  收藏  举报