2015-09-02 1 views
3

Моя Gradle задача выглядит следующим образомGradle Copy Task всегда в актуальном

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, все будет работать нормально. Но тогда код выполнялся, даже если я выполняю градиентные задачи, которые мне не нужны. Что я делаю не так ?

+0

Решено ли? Возможно, я встретил тот же вопрос. https://stackoverflow.com/questions/44198227/gradle-task-type-copy-and-dolast-cant-both-work – XaoFay

ответ

0

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

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

println работает даже тогда, когда я выполняю градиентные задачи, но копия не работает. Это немного запутывает? – Abhik

+0

Пожалуйста, взгляните на этот вопрос: http://stackoverflow.com/questions/23546286/gradle-task-should-not-execute-automatically/23546350#23546350. Этот 'println' выполняется во время настройки. – Opal

+0

Да Я понимаю концепцию этапа выполнения и конфигурации. Итак, мой вопрос заключается в том, как заставить всю задачу работать только на этапе выполнения и не страдать от проблем UpToDate, таких как выше? – Abhik

2

Копия задание только запускается на выполнение, если у него есть что-то копировать. Говорить, что копировать, является частью настройки задачи, и поэтому ее нужно выполнять на фазе конфигурации, а не на этапе выполнения. Это очень важные концепции для понимания, и вы можете прочитать их в Руководстве пользователя Gradle или на форумах Gradle.

doFirst и doLast блоки выполняются на этапе выполнения, как часть выполнения задачи. Слишком поздно говорить о том, что нужно копировать: doFirst запускается непосредственно перед действием главной задачи (что в данном случае является копированием), но (в скором времени) после пропущенных и обновленных проверок (основанных на конфигурация задачи). doLast выполняется после основного действия задачи, и поэтому явно слишком поздно.