Почему моя задача Gradle всегда выполняется?
Если я бегу ./gradlew clean
или же ./gradlew tasks --all
, он всегда выполняет мою задачу компиляции (которую я переписал в скрипте Gradle, как показано ниже)
task eclipse(overwrite: true) {
exec { commandLine = ["./play1.3.x/play", "eclipsify"] }
}
task compileJava(overwrite: true) {
exec { commandLine = ["./play1.3.x/play", "precompile"] }
}
task deleteDirs(type: Delete) {
delete 'precompiled', 'tmp'
}
//NOW, assemble needs to zip up directories precompiled, public, lib, and conf
clean.dependsOn('deleteDirs')
Я не понимаю, почему eclipse не запускается каждый раз и, кажется, работает нормально, хотя переопределение компиляции не работает.
2 ответа
Очень важно понимать разницу между конфигурацией задачи и ее выполнением:
task eclipsify {
// Code that goes here is *configuring* the task, and will
// get evaluated on *every* build invocation, no matter
// which tasks Gradle eventually decides to execute.
// Don't do anything time-consuming here.
doLast {
// `doLast` adds a so-called *task action* to the task.
// The code inside the task action(s) defines the task's behavior.
// It will only get evaluated if and when Gradle decides to
// execute the task.
exec { commandLine = ["./play1.3.x/play", "eclipsify"] }
}
}
// Improving on the previous task declaration, let's now use a *task type*
// (see `type: Exec` below). Task types come with a predefined task action,
// so it's typically not necessary to add one yourself. Also, many task types
// predefine task inputs and outputs, which allows Gradle to check if the task
// is up-to-date. Another advantage of task types is that they allow for
// better tooling support (e.g. auto-completion of task properties).
task precompile(type: Exec) {
// Since this task already has a task action, we only
// need to configure it.
commandLine = ["./play1.3.x/play", "precompile"] }
}
Если вы не правильно настроите конфигурацию и выполнение, вы увидите такие симптомы, как очень длительное время запуска и задачи, которые, по-видимому, выполняются, когда они не должны.
Чтобы узнать, какие типы задач доступны и как их настроить, ознакомьтесь со Справочником по языку сборки Gradle. Кроме того, постоянно пополняется список сторонних плагинов и типов задач.
PS: я изменил имена задач и удалил overwrite: True
(что следует использовать только в качестве крайней меры), чтобы не отвлекать от основного сообщения моего ответа.
Gradle не знает, что ваш источник не был изменен. Для любого неизвестного статуса он помечает задачу как устаревшую. Так как ваша задача - это 100% замена compile
тогда вы несете ответственность за предоставление статуса задачи.
В главе " Создание пользовательских классов задач" подробно рассказывается, как начать работу с добавочными задачами.
Запустите свой проект с --info
флаг, чтобы увидеть, почему Gradle отмечает compile
задача как не актуальная.
Надеюсь, поможет.