Gradle,一个任务中的执行顺序是什么?

时间:2017-01-27 09:07:32

标签: gradle

Gradle 2.14 我写自定义任务“运行”

 task run() {
    def allVariantList = [];
    android.applicationVariants.all { variant ->
        allVariantList.add(variant.getName())
        println "Current allVariantList = " + allVariantList
    }
    println "Result allVariantList = " + allVariantList
}

开始我的任务: gradlew run

结果:

结果allVariantList = []

当前allVariantList = [prod_no_check]

当前allVariantList = [prod_no_check,prod]

当前allVariantList = [prod_no_check,prod,stage]

当前allVariantList = [prod_no_check,prod,stage,dev]

当前allVariantList = [prod_no_check,prod,stage,dev,release]

当前allVariantList = [prod_no_check,prod,stage,dev,release,dev_no_check]

问题:

  1. 为什么 println“结果allVariantList =”+ allVariantList println之前运行“当前allVariantList =”+ allVariantList

  2. 我需要 println“结果allVariantList =”+ allVariantList 执行AFTER println“Current allVariantList =”+ allVariantList 。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

我认为问题是,在你的任务配置时(你在配置时完成所有工作,而不是执行时间,android插件尚未配置applicationVariants。{{1} }运行已添加的所有变体以及将来添加后添加的所有变体。

因此,您的输出会显示在配置时尚未设置变体,因此您的结果打印为空,其他的则在创建变体后出现。

正如您在配置时所做的那样,即使您没有执行任务,它也将始终完成。如果您拨打applicationVariants.all或其他任何内容,您将获得相同的输出。

所以要么在执行阶段执行所有代码(将其包装在gradlew help闭包中),要么至少在执行阶段执行结果打印。如果您需要在执行阶段之前完成您的工作,并且无论您的任务是否实际运行,您可能至少将结果打印包裹在评估项目后执行的doLast { }闭包中,但仍然在配置阶段。

答案 1 :(得分:0)

好的,谢谢大家。这是工作:

task run() {
  description "Install and run app on device/emulator"
  def allVariantList = [];
  android.applicationVariants.all { variant ->
    allVariantList.add(variant.getName())
    println "Current allVariantList = " + allVariantList
  }
  doLast {
    println "Result allVariantList = " + allVariantList
  }
}

这是解释。 https://docs.gradle.org/current/userguide/build_lifecycle.html

例22.1。单个项目构建