Gradle 复制任务始终是最新的

Gradle Copy Task is always Up To Date

我的 gradle 任务看起来像这样

task xml_file_to_vs_build(type: Copy) {
   outputs.upToDateWhen { false }
   doLast {
      outputs.upToDateWhen { false }
      println("copying strings.xml");
      from 'src/main/res/values'
      into '../vso_build'
      include 'strings.xml'
   }
}

任务始终是最新的。如果我将块置于配置阶段,即在 doLast 之外,一切正常。但是即使我执行了我不想要的 gradlew 任务,代码也会执行。我做错了什么?

您应该按以下方式定义任务:

task xml_file_to_vs_build(type: Copy) {
   println("copying strings.xml")
   from 'src/main/res/values'
   into '../vso_build'
   include 'strings.xml'
}

复制任务只有在有内容要复制时才会执行。告诉它复制什么是配置任务的一部分,因此需要在配置阶段而不是执行阶段完成。这些是需要理解的非常重要的概念,您可以在 Gradle 用户指南或 Gradle 论坛上阅读它们。

doFirst 和 doLast 块在执行阶段执行,作为执行任务的一部分。两者都来不及告诉任务要复制什么:doFirst 在主要任务操作(在本例中是复制)之前立即执行,但(不久)在跳过和最新检查(基于任务的配置)。 doLast 在主要任务操作之后执行,因此显然为时已晚。