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

时间:2017-03-07 12:18:26

标签: gradle

gradlew tasks给了我这些任务(等等):

assemble - Assembles all variants of all applications and secondary packages.
assembleAndroidTest - Assembles all the Test applications.
assembleDebug - Assembles all Debug builds.
assembleRelease - Assembles all Release builds.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
clean - Deletes the build directory.
cleanBuildCache - Deletes the build cache directory.
compileDebugAndroidTestSources
compileDebugSources
compileDebugUnitTestSources
compileReleaseSources
compileReleaseUnitTestSources
mockableAndroidJar - Creates a version of android.jar that's suitable for unit tests.

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

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.

为什么?

1 个答案:

答案 0 :(得分:1)

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

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

所以:

project.afterEvaluate {
   assembleDebug {
      doFirst {
         println "hello"
      }
   }
}