2015-04-13 2 views
20

Как вы можете правильно отметить задачу «Грейдл» как «актуальную», когда задача не производит никакого вывода? Задача должна оставаться «актуальной», если последний прогон был успешным, и с тех пор исходные данные не изменились. Gradle руководство государства непосредственно перед разделом 15.9.2 следующее:«До даты» Состояние задачи «Грейдл», когда он не имеет выхода

"A task with no defined outputs will never be considered up-to-date." 

Как можно отметить задачи, вплоть до настоящего времени в этом случае? Похоже, что Gradle должен знать время последнего успешного запуска, а затем сравнивать его с последним измененным временем ввода. Как обходной путь сценарий мог создать/коснуться пустого файла, чтобы пометить задачу как завершенную? Есть ли другие предлагаемые способы обхода?

+0

С тех пор документация изменилась, поэтому эта цитата exat больше не присутствует. Последнее изменение, похоже, исходит из [этой фиксации] (https://github.com/gradle/gradle/commit/655cbf2d0de02c499ea544e3fa5c451aed293a7d#diff-3c7e708f2e623215ccb37c9c0ae83eefL330). – mkobit

ответ

12

Чтобы просто продумать разные сценарии ...

  • задачи без каких-либо входов или выходов. Они работают все время. Это может быть просто завершение существующего исполняемого файла «сделай что-нибудь».

  • Задачи со входами и выходы. Они запускаются при изменении входов или выходов. Это может быть компилятор.

  • Задачи с только выходы. Они запускаются только тогда, когда выходы изменены/не существуют. Это может быть что-то, что что-то загружает. (Я думаю, что они в действительности довольно редки, я бы подсчитал URL-адрес для загрузки в качестве ввода.)

  • Задачи со входами и выходами. Я не сталкивался с этим на практике.

Как вы уже сказали, вы можете обмануть обновленные проверки с выходным файлом, который просто пуст. Встроенная задача Gradle Test наиболее похожа на то, что вы описываете, и она имеет «отчет» в качестве вывода. Думаю, у вас, вероятно, тоже будет что-то похожее. Это может быть так же просто, как захват stdout/stderr задачи и помещение его в файл. Это не слишком полезно, когда все проходит, но было бы полезно, когда все провалится.

Конечно, любой из них может быть дополнен пользовательским кодом upToDateWhen. например, у вас есть задача, которая запускает веб-сервер и является «актуальной», когда веб-сервер уже запущен. Я не думаю, что это хорошо подходит тому, что вы здесь описываете.

Чтобы начать с, я хотел бы попробовать:

outputs.files file("${buildDir}/reports/${name}.out")

Я думаю, что бы работать с или без фактического положить что-то в этом файле.

+0

Спасибо @bigguy, я реализовал его, как вы предложили, и он работает хорошо. – brunobowden

+6

Типичным примером задачи с inuts является только проверка. У меня есть пример, где я проверяю, что разработчики не ввели конкретные URL-адреса, имена пользователей или пароли в файлах, которые должны быть доставлены в сборке. Если найдено, мы выходим из строя с исключением. Но я добавлю «отчет» в качестве вывода, спасибо за предложение! –

+0

Я столкнулся с такой задачей при выполнении инструментов, которые загружают файлы (если загрузка только выводится, тогда загрузка только вводится). Я решил это, определив те же файлы/dirs, что и входы и выходы. –

-1

Вы можете переопределить задачи upToDateWhen.

task createDist(type: Zip) { 
    outputs.upToDateWhen { 
    return true 
    } 
} 

Таким образом, с истиной это всегда актуально и неверно всегда устарело. Вы можете определить любой тип пользовательской логики, чтобы определить, является ли она актуальной.

+1

Логика, которую я хочу, это то, что она актуальна, если в прошлый раз не было ошибок, и с тех пор входы не изменились - я не верю, что могу легко написать функцию upToDateWhen. Gradle должен знать, когда последний успешный прогон был, поэтому я думаю, что это может быть разрешено только временным файлом. Я думал, что у Грейдла будет лучший ответ для такого типа ситуации. – brunobowden

+0

Думаю, что я был немного готов ответить в последний раз. Gradle снова запустит вашу задачу, если вы ничего не измените в задаче, например, распечатываете информацию или что-то подобное. Если вы используете задачу по умолчанию, такую ​​как задание Zip, она уже имеет определенные выходы. Если ваша задача изменяет состояние мира, тогда вы должны определить выходы как выходы задачи. – Nullstress

+0

В этом случае он просто запускает некоторые модульные тесты и проверяет отсутствие сбоев - поэтому нет выходного файла. Лучше всего я могу подумать о том, чтобы добавить «tests-ran.txt», который ничего не делает. – brunobowden

Смежные вопросы