我想运行./gradlew verifyProjectDebug来运行一部分验证任务。
verifyProjectDebug尝试提取项目中的一部分任务并执行它们。
static def isValidTask(String name) {
def isLint = name.matches("lint.*Debug")
def isKtlint = name.matches("ktlint.*Debug.*Check")
def isUnitTest = name.matches("test((?!Prod|Staging).)*DebugUnitTest")
return (isLint || isKtlint || isUnitTest) && !name.contains("Prod")
}
task verifyProjectDebug() {
group = "verification"
description = "Runs lint, ktlint and tests for all debug non-production variants"
doLast {
getSubprojects()
.collect { it.tasks }
.flatten()
.findAll { isValidTask(it.name) }
.each { it.execute() }
}
}
不幸的是,在任务上调用.execute()不会调用其依赖项,因此某些任务由于未调用其依赖项而失败。
在gradle中有什么方法可以实现这一目标。多谢!
答案 0 :(得分:3)
execute
是Task
类的方法。您正在尝试绕过Gradle构建系统。执行任务或创建实例并调用execute
并不是一件简单的事情。 Gradle处理依赖项注入,缓存,输入和输出处理以及各种处理。因此,请充分利用Gradle。
创建一个 lifecycle任务,它是您要执行的所有操作的父任务。
final def verifyProject = tasks.register("verifyProject")
生命周期任务是一项不执行任何工作的任务,它仅取决于其他任务。
您只能引用已经创建的任务。例如,在创建调试变量之前,您不能引用调试变量的lint任务。
在创建每个变体时对其进行处理,找到要执行的所有任务,并将它们连接到主任务。
android.applicationVariants.all {
final def cappedVariantName = name.capitalize()
// For every build variant that has build type "debug"...
if (variant.buildType == "debug") {
verifyProject.configure {
dependsOn("lint$cappedVariantName")
dependsOn("ktlint$cappedVariantName")
dependsOn("test${cappedVariantName}UnitTest")
}
}
}
请验证要执行的任务的名称。
现在,当您运行gradlew verifyProject
时,此任务依赖的所有任务都将执行。您负责依赖性。
如果您想在Android库模块中使用它,请将android.applicationVariants
替换为android.libraryVariants
。
代码遵循Task Conviguration Avoidance。这意味着除非您专门调用它们,否则不会配置您定义的任务。运行构建时,这应该节省资源(CPU和内存)。
要为所有模块自动执行此操作,请选择以下一项或两项,并放入您的根项目 build.gradle
。
subprojects { project ->
project.plugins.whenPluginAdded { plugin ->
// For all libraries and only libraries:
if (plugin instanceof com.android.build.gradle.LibraryPlugin) {
project.android.libraryVariants.all { variant ->
// See above.
}
}
// For all apps and only apps:
if (plugin instanceof com.android.build.gradle.AppPlugin) {
project.android.applicationVariants.all { variant ->
// See above.
}
}
}
}
答案 1 :(得分:0)
将其放在项目级别的gradle文件中即可。
task verifyDebugProjects() {
group = "verification"
description = "Runs lint, ktlint and tests for all debug non-production variants"
}
static def isValidVerifyDebugTask(String name) {
def isLint = name.matches("lint.*Debug")
def isKtlint = name.matches("ktlint.*Debug.*Check")
def isUnitTest = name.matches("test((?!Prod|Staging).)*DebugUnitTest")
return (isLint || isKtlint || isUnitTest) && !name.contains("Prod")
}
gradle.projectsEvaluated {
getSubprojects()
.collect { it.tasks }
.flatten()
.findAll { isValidVerifyDebugTask(it.name) }
.each { verifyDebugProjects.dependsOn it }
}