Подтвердить что ты не робот

Gradle Задача вызова других задач в порядке

Я делаю задачу в gradle, которая должна вызывать ряд других задач.

Вот что у меня есть:

task ci(dependsOn: [
    clean,
    build,
    test
])

Что странно - это результат, который я вижу:

gradle ci
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:clean             // cleaning after the build
:build
:ci

Обратите внимание, что очистка происходит после цели сборки, которая уничтожает мою сборку.

Если я изменю свою задачу на:

task ci(dependsOn: [
    clean,
    test
])

Затем он появляется в правильном порядке:

:clean UP-TO-DATE    // cleaning before the build
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:ci UP-TO-DATE

Я попытался исправить исходную цель, добавив build.dependsOn clean, но это, похоже, не влияет.

Любая помощь приветствуется.

4b9b3361

Ответ 1

Кажется, я наткнулся на проблему, обсуждаемую в GRADLE-427, в которой gradle определяет лучший порядок выполнения задач, Я решил свою проблему, следуя рекомендациям, которые также описаны в Gradle Руководство пользователя - Раздел 15.5, чтобы установить порядок между разрозненными задачами. Таким образом, моя конечная цель ci выглядит следующим образом:

task ci(dependsOn: ['clean', 'build', 'uploadArchives'])
build.mustRunAfter clean
uploadArchives.mustRunAfter build

И теперь все работает так, как ожидалось.

Ответ 2

Версия TL;DR: Вот как я это сделал в одном из моих проектов (без введения искусственных зависимостей).

//--- build aliases : define a synonym here if you want a shortcut to run multiple targets

def buildAliases = [
   'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'],
   'rebuild' : ['clean', 'assemble']
]
def expandedTaskList = []

gradle.startParameter.taskNames.each {
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it)
}

gradle.startParameter.taskNames = expandedTaskList.flatten()

println "\n\n\texpanded task list: ${gradle.startParameter.taskNames }\n\n"

Для получения дополнительной информации см.:

https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

Ответ 3

Я бы предпочел не добавлять задачу оболочки только для того, чтобы сделать заказ.

В этом случае мое решение выглядит следующим образом:

run.dependsOn 'clean' compileJava.mustRunAfter 'clean'

Это гарантирует выполнение задачи clean до gradle выполняет compileJava. Таким образом, вы создадите новую сборку все время.

Надеюсь, что это поможет.

Ответ 4

Используя некоторые преимущества Groovy/Gradle, решение может быть дополнительно улучшено с помощью следующего:

def taskNames = [...] // list of task names

task('lastTask', dependsOn: taskNames)

taskNames.inject(null) { acc, val ->
  if (acc != null) tasks[val].mustRunAfter acc
  tasks[val]
}

Таким образом, у вас может быть одно место со списком задач.