为什么有些gradle任务无法访问?

为什么有些gradle任务无法访问?,gradle,Gradle,gradlew tasks为我提供了这些任务(以及其他任务): 我可以添加额外的代码,例如,汇编,如下所示: assemble { doFirst { println "hello" } } 但无法与此列表中的许多其他对象一起执行此操作,例如,尝试添加到assembleDebug时会出现以下错误: Error:(65, 0) Could not find method assembleDebug() for arguments [build_6s1kvuwgpa

gradlew tasks
为我提供了这些任务(以及其他任务):

我可以添加额外的代码,例如,
汇编
,如下所示:

assemble {
    doFirst {
        println "hello"
    }
}
但无法与此列表中的许多其他对象一起执行此操作,例如,尝试添加到
assembleDebug
时会出现以下错误:

Error:(65, 0) Could not find method assembleDebug() for arguments [build_6s1kvuwgpamstoh3d4xsg1ndv$_run_closure3@13494795] on project ':app' of type org.gradle.api.Project.

这是为什么?

很容易解释。当您运行gradle脚本时,它将按照声明的顺序进行计算。但是——有时候,android project就是一个很好的例子——您不知道(也不知道)可以创建哪些任务,因为它们基于project的内容(文件、变体等等)。因此,在对整个项目进行评估之前,就会创建这些任务。这就是为什么您无法在
build.gradle
中访问它们,因为项目评估尚未完成

现在,如果您知道将创建名为
assembleDebug
的任务,则可以使用
[afterEvaluate
]在评估后配置任务。此时,将评估整个项目,并添加/生成所有任务

因此:

Error:(65, 0) Could not find method assembleDebug() for arguments [build_6s1kvuwgpamstoh3d4xsg1ndv$_run_closure3@13494795] on project ':app' of type org.gradle.api.Project.
project.afterEvaluate {
   assembleDebug {
      doFirst {
         println "hello"
      }
   }
}