【问题标题】:How to make tasks execute one after another?如何让任务一个接一个地执行?
【发布时间】:2014-07-15 20:05:59
【问题描述】:

基本上我有 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. compileReleaseJava 在 build.gradle 中无法识别,并出现此特定错误:Could not find property 'compileJava' on task ':drmdexsecondary:dexClasses'.

有人可以帮忙吗?

我已经查阅并从文档中复制粘贴,但它们似乎都不起作用。我什至尝试重新安装 Gradle ......那里的示例代码很少,虽然我理解这个概念,但似乎很难将我的意图转化为工作 Gradle 代码,所以如果有任何好的资源可以帮助,也将不胜感激。

【问题讨论】:

    标签: java android gradle


    【解决方案1】:

    您应该阅读有关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
    

    【讨论】:

    • 我同意这在可能的情况下是更可取的,但通常一些插件等提供了一些完善的常用任务,您希望为这些任务插入一些特殊的行为。您可以定义取决于这些的特殊任务,但如果这些任务是众所周知的变化,一些开发人员甚至不会注意到您的特殊任务变体,而是直接调用众所周知的testpublish 任务因为没有办法将这些设为私有。
    【解决方案2】:

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

    【讨论】:

    • 谢谢! finalizedBy 正是我想要的! :)
    • 只有在之前的任务成功的情况下才能让它运行?
    • 好的,添加这个似乎可以解决问题task2.onlyIf { task1.state.failure == null }
    【解决方案3】:

    最佳答案在这里

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

    当你执行 gradle task2 时。

    这将首先执行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 文件夹。并执行成功。

    【讨论】:

      【解决方案4】:

      对于您想要运行任务的顺序或任何顺序,我在 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]]        
           }
      }
      

      【讨论】:

      • 这不是一种“漂亮”的做事方式,而是一种“hack”。我不建议这样做。正如之前的答案所述 - Gradle 概念是“依赖于事物”
      【解决方案5】:

      您可以创建GradleBuild 类型的任务并在该任务中定义任务。

        task releaseAfterMath(type: GradleBuild) {
            tasks = [
              'clean', 
              'build',
              'publish',
              'publishToMavenLocal',
              'commitNewVersionTask', 
              'gitChangelogTask', 
              'commitChangelogTask'
            ]
        }
      

      您可以像任何其他任务一样触发releaseAfterMath。在这里运行代码:

      https://github.com/tomasbjerre/gradle-scripts/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-30
        • 2021-08-27
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 2023-02-11
        相关资源
        最近更新 更多