Gradle:如何让任务一个接一个地执行?

时间:2014-05-27 03:08:04

标签: java android gradle

基本上我需要按顺序运行4个任务,但是我不能让它们这样做,我必须在命令行上逐个运行它:

gradle :drmdexsecondary:compileReleaseJava --info --debug --stacktrace
gradle :drmdexsecondary:dexClasses --info --debug --stacktrace
gradle :drmdexsecondary:jar --info --debug --stacktrace

这是我的build.gradle:

evaluationDependsOnChildren();

task dexClasses( type:Exec ) {

//    compileJava.execute()

    String cmdExt = Os.isFamily(Os.FAMILY_WINDOWS) ? '.bat' : ''

    println("${buildDir}")
    println("${androidSdkDir}\\build-tools\\${buildToolsVersion}\\dx${cmdExt} --dex --output=${buildDir}\\classes\\classes.dex ${buildDir}\\classes\\release")

    commandLine "cmd", "/c", "${androidSdkDir}\\build-tools\\${buildToolsVersion}\\dx${cmdExt} --dex --output=${buildDir}\\classes\\classes.dex ${buildDir}\\classes\\release"
}

task jar(type: Jar) {
    from ("${buildDir}\\classes\\classes.dex")
}

我的问题基本上是: 1. dependsOn关键字不起作用......只是在没有任何日志消息的情况下被忽略 2. taskname.execute()函数不起作用......只是在没有任何日志消息的情况下被忽略 3.使用此特定错误在build.gradle中无法识别compileReleaseJavaCould not find property 'compileJava' on task ':drmdexsecondary:dexClasses'.

有人请帮忙吗?我已经从文档中查阅并复制了粘贴,但它们似乎都不起作用。我甚至试图重新安装gradle ...那里的示例代码很少,虽然我理解这个概念,但是将我的意图转换为工作的gradle代码似乎很难,所以如果有任何好的资源来帮助,非常感谢...谢谢!

4 个答案:

答案 0 :(得分:11)

您应该阅读gradle tasksmore about tasks。你想依赖事物而不是调用事物。

此外,我认为您应该阅读并使用gradle android plugin

对于原始问题,在定义任务时,大括号之间的代码在配置时运行。执行任务时会运行任务的操作,并且必须将其添加到任务的操作列表中。这是通过使用任务的doFirst,doLast或<<操作

以下是gradle文档中的示例。

task taskX << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}
task taskZ << {
    println 'taskZ'
}
taskX.dependsOn taskY
taskY.dependsOn taskZ
taskZ.shouldRunAfter taskX

答案 1 :(得分:4)

最佳答案就在这里

task myTask1() {
  println("this is task1 running") 
}

task task2() { dependsOn myTask1
  println("this is task2 running") 
}

当您执行渐变任务2 时。

这将首先执行task1,然后执行task2

您应该使用dependsOn关键字

例如


task buildMyApk(type: Exec) {
    def myCommond = ['gradle', "assembleRelease"]
    commandLine myCommond
}



task moveApkFileToProjectFolder() { dependsOn buildMyApk
    def releaseApkFilePath = "${buildDir}/outputs/apk/release/"
    def targetApkFolder = "${rootProject.getProjectDir()}/apkFolder"
    mkdir "${targetApkFolder}"
    copy{
        from releaseApkFilePath
        into targetApkFolder
    }
}

以上答案无效 任务moveApkFileToProjectFolder运行,将首先运行buildMyApk。

我的示例任务,首先将构建apks,然后将apk文件移动到我的Project / apkFile文件夹中,然后执行成功。

答案 2 :(得分:3)

对于顺序或任何您想要运行任务的序列,我在build.gradle文件中执行以下操作:

def modules = ["X", "Y", "Z", "ZZ"]

if (modules.size() > 1) {
    for(j in 1 .. modules.size()-1 ) {
        tasks[modules[j]].mustRunAfter  modules[values[j-1]]        
     }
}

答案 3 :(得分:0)

task1.finalizedBy task2将在task1之后运行task2。