4.3排除任务
问题
您希望从构建过程中排除某些任务。
解
使用-x标志排除单个任务。通过修改任务图排除多个任务。
讨论
Gradle构建过程涉及许多按顺序执行的任务。它们中的大多数依赖于在过程中较早执行的任务,但是如果时间是关键的,则有一些可以被排除。
例如,lint任务对于确定您的项目遵守Google针对Android应用程序的推荐做法的程度非常有用,但不一定每次都要运行它。
回想一下Gradle中的-x标志(--exclude-task的缩写)排除了给定的任务。因此,运行构建时,使用标志跳过lint任务(或任何其他不需要的任务),如例4-11所示。
实例4-11。排除lint任务
> ./gradlew build -x lint
这排除了lint任务及其任何依赖关系。任何需要其结果的任务都不会运行,因此请确保在过程中不需要排除任何任务。
唯一的问题是,如果你的项目涉及多个变体,每个都有一个lint任务。原则上,您可以手动排除它们,但您可能更喜欢将整个集合作为构建的一部分。
当Gradle运行时,它组装一个有向无环图,称为任务图。你可以通过gradle对象在你的构建文件中得到它的引用。对图形的任何操作都需要在形成之后进行,因此,在应用任何更改之前,您需要使用whenReady属性。
结果是你可以在构建文件中编写代码,如例4-12所示。
实例4-12。禁用以lint开头的所有任务
gradle.taskGraph.whenReady {graph - >
graph.allTasks.findAll {it.name ==/lint.*/} *。enabled = false
}}
任务图的allTasks属性使用正常的Groovy习语调用getAllTasks方法。返回一个任务的java.util.List。 Groovy向List添加了一个findAll方法,该方法仅返回满足提供的闭包的任务。
在这种情况下,闭包说访问每个任务的name属性,并检查它是否与正则表达式完全匹配。将“spread-dot”运算符应用于结果列表将禁用列表中的每个任务。
结果是所有名称以字母lint开头的任务都将其enabled属性设置为false,因此它们都不会运行。
由于您可能不希望始终排除所有lint任务,因此可以在执行此操作之前检查项目属性是否已设置,如例4-13所示。
实例4-13。如果设置了noLint属性,则仅禁用lint任务
gradle.taskGraph.whenReady { graph ->
if (project.hasProperty('noLint')) {
graph.allTasks.findAll { it.name ==~ /lint.*/ }*.enabled = false
}
}您可以使用-P标志从命令行设置项目属性,如例4-14所示。
实例4-14。设置项目属性
> ./gradlew build -PnoLint | grep lint
:app:lintVitalArrogantRelease SKIPPED
:app:lintVitalFriendlyRelease SKIPPED
:app:lintVitalObsequiousRelease SKIPPED
:app:lint SKIPPED
显然,在这种方法中涉及了大量的Groovy知识,但是在任务图组装后操作任务图的想法是非常强大的。