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

Понимание зависимостей задачи Gradle (dependsOn)

Два вопроса:

  • Что такое gradle способ указать, что 1 задача состоит из нескольких других задач?
  • Похоже, что метод gradle taskName.execute() не соблюдает отношения dependOn от taskName, это правда и что такое обход?

Больше фона:

Сейчас у меня есть сборка script, у которой нет плагинов (а не Java другими словами). Мне нужна задача с именем tests, которая будет запускать все мои тестовые задачи. У меня есть 3 таких задания. Вызовите их task1, task2 и task3.

Я мог бы сказать tests.dependsOn ['task1', 'task2', 'task3']

Это немного неудобно, потому что отношения кажутся tests.isComprisedOf ['task1', 'task2', 'task3']

Я мог бы сказать:

task tests << {
    task1.execute()
    task2.execute()
    task3.execute()
}

но затем task3, который сам зависит от taskSetup, запускается без запуска taskSetup. Другими словами, вызов execute(), похоже, не соответствует стратегии разрешения зависимостей gradle.

Последняя маленькая проблема (я действительно люблю gradle кстати), заключается в том, что трудно искать в этой теме, потому что зависимость означает две разные вещи в gradle: dependOn зависимости стиля и зависимости стиля библиотеки.

4b9b3361

Ответ 1

Gradle модель задачи "плоская" и не имеет понятия агрегации. (Важно отметить, что TaskInternal#execute является внутренним методом и не должен вызываться из скриптов сборки.) Агрегация часто моделируется заданием жизненного цикла (задача с зависимостями задач, но без каких-либо действий задачи):

task allTests {
    dependsOn tasks.withType(Test)
}

Помимо dependsOn поддерживаются следующие отношения задач: mustRunAfter, shouldRunAfter и finalizedBy.

Ответ 2

Обычно вы не вызываете task.execute().

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

task task1 << {
   println "Hello"
}

task task2 << {
   println "World"
}

task task3(dependsOn: 'task3dependency') << {
   println "QBert"
}

task task3dependency << {
   println "MR"
}

task tests(dependsOn: ['task1', 'task2', 'task3'])

Выводится:

$ gradle tests
:task1
Hello
:task2
World
:task3dependency
MR
:task3
QBert
:tests

BUILD SUCCESSFUL

Имейте в виду, что порядок выполнения ваших задач зависимостей не всегда гарантирован, но вы можете смягчить это с помощью с указанием порядка task2.mustRunAfter task1. Обычно задачи выполняются в том порядке, в котором вы ожидаете.

Кроме того, вы должны прочитать Gradle Жизненный цикл сборки. Когда вы используете синтаксис task task1 << {...}, вы указываете закрытие, которое выполняется на этапе выполнения задачи. Перед выполнением выполнения фаза конфигурации оценивает вашу конструкцию script и определяет задачи, которые должны выполняться и в каком порядке. Когда вы вручную выполняете задачи, как в:

task tests << {
    task1.execute()
    task2.execute()
    task3.execute()
}

вы обошли Gradle способность оценивать зависимости задачи task3, поэтому она запускает только task3.