Пропуск выполнения зависимостей отключенной задачи в Gradle?

Возможно ли как-то не выполнять зависимости задачи, когда эта задача будет пропущена?

В приведенном ниже примере я бы хотел, чтобы jar (и зависимости jar) не выполнялись, если сервер уже запущен при выполнении runServerTests. В этом случае сервер будет запущен другим процессом.

apply plugin: 'java'

task startServerIfNotRunning(dependsOn: jar) {
  onlyIf { isServerNotRunning() }
  ...
}

task runServerTests(dependsOn: startServerIfNotRunning) { ... }

Я бы предпочел не добавлять onlyIf к задаче jar, поскольку другие задачи, которые всегда должны выполняться, могут зависеть от этой задачи. Задача jar также имеет свои собственные зависимости.


person David Pärsson    schedule 25.04.2013    source источник
comment
Я не знаю ответа здесь, но если ваш сервер зависит от jar, и jar устарел, почему бы вам не перезапустить сервер? Если jar обновлен и все его зависимости обновлены, это не будет стоить вам так много времени, поскольку задача jar не выполняет никаких действий ...   -  person erdi    schedule 25.04.2013
comment
Хотя вы правы, у нас есть много подпроектов, поэтому полная перекомпиляция занимает около 15-30 секунд, даже если все обновлено. Я бы хотел по возможности избавиться от этого времени. Большую часть времени сервер будет в актуальном состоянии.   -  person David Pärsson    schedule 26.04.2013
comment
См. stackoverflow.com/questions/18624391/   -  person Noel Yap    schedule 18.09.2013


Ответы (2)


Чтобы получить желаемое поведение, вы должны исключить задачу из графа выполнения задачи, а не пропускать ее выполнение. Вы можете сделать это с помощью -x из командной строки или программно с помощью gradle.startParameter.excludedTaskNames << "..." или gradle.taskGraph.useFilter { task -> ... }.

person Peter Niederwieser    schedule 26.04.2013
comment
Хорошо, спасибо. Я предполагаю, что это нужно сделать на этапе настройки? - person David Pärsson; 26.04.2013
comment
да. На этапе выполнения граф выполнения задачи больше не может быть изменен. - person Peter Niederwieser; 26.04.2013
comment
@PeterNiederwieser Не могли бы вы объяснить более подробно или подробно рассказать о втором методе, который вы упомянули? Я не могу найти userFilter в связанных документах gradle.org/docs/current/javadoc/index.html?org/gradle/api/ - person ZenBalance; 26.07.2013
comment
См. org.gradle.execution.TaskGraphExecutor.useFilter. - person Peter Niederwieser; 05.09.2013

Вы можете сделать что-то вроде

task startServerIfNotRunning(dependsOn: jar) {
    if (isServerNotRunning()) {
        enabled = false;
        dependsOn = [];
    }
}

Оператор if, который мы оцениваем на этапе конфигурации, и зависимые задачи удаляются. Я резюмировал это в Пропуск задач Gradle с кодом и выводом. Взглянем.

person Aniket Thakur    schedule 28.12.2014
comment
Однако у этого есть один недостаток: isServerNotRunning() будет вызываться на этапе настройки Gradle каждый раз, а не только тогда, когда эта задача будет выполнена. - person David Pärsson; 31.12.2014
comment
Нет, код в вашем примере выполняется на этапе конфигурации, и на этом этапе все задачи (в текущем проекте) всегда настраиваются. Задачи не всегда выполняются, но я не об этом. Я проверил это в Gradle 2.2.1, которая является последней версией на момент написания. - person David Pärsson; 02.01.2015
comment
Вы правы, это недостаток. Проверено и со старыми версиями. Беру свой предыдущий комментарий. - person Aniket Thakur; 03.01.2015