Задача Gradle Copy всегда актуальна


Моя задача 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'
   }
}

Задача всегда актуальна . Если я поставил блок на этапе конфигурации, т. е. из доласт, все отлично работает. Но тогда код выполняется, даже если я выполняю gradlew задачи, которые я не хочу. Что я делаю не так?

2 3

2 ответа:

Вы должны определить задачу следующим образом:

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 и доласт блоков выполняется на этапе выполнения, в рамках выполнения задач. Оба слишком поздно, чтобы сказать, что задача скопировать: doFirst выполняется непосредственно перед основным действием задачи (которое в данном случае является копированием), но (вскоре) после пропущенных и обновленных проверок (которые основаны на конфигурации задачи). доласт исполняется после выполнения основного действия задачи, и поэтому явно слишком поздно.