Как вы выполняете встроенную задачу gradle в закрытии doFirst/doLast?

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

task testNGTests(type: Test) {
     useTestNG()
}

и я пытаюсь использовать его в закрытии doFirst, подобном этому

task taskA {
  doFirst {
        testNGTests.execute()
   }
}

но почему-то не работает, я тоже пробовал

testNGTests.executeTests() 

но и это не сработало. Есть ли особый способ справиться со встроенной тестовой задачей?

Я использую Gradle версии 0.9.2.


person AgentRegEdit    schedule 23.01.2012    source источник
comment
Задачи не поддерживают вызовы execute(). Делают только замыкания (т.е. определения методов).   -  person IgorGanapolsky    schedule 01.08.2016


Ответы (2)


Выполнение задачи из другой задачи официально не поддерживается (и никогда не поддерживалось). Вместо этого попробуйте использовать зависимости задач, например. taskA.dependsOn(testNGTests).

person Peter Niederwieser    schedule 23.01.2012
comment
Но нет способа поддерживать порядок, если есть несколько зависимостей, верно? Как бы я обойти это? - person AgentRegEdit; 24.01.2012
comment
Пожалуйста, приведите конкретный пример. taskA.dependsOn(taskB, taskC) — это сокращение от taskA.dependsOn(taskB); taskA.dependsOn(taskC). Но вы, конечно, можете сделать taskA.dependsOn(taskB); taskB.dependsOn(taskC). - person Peter Niederwieser; 24.01.2012
comment
поэтому, если у меня есть taskA (dependsOn: taskB, taskC) gradle, он будет запускать задачу C, задачу B, а затем задачу A, но если у меня taskA(dependsOn: taskC, taskB) gradle по-прежнему запускает ее в порядке задача B, задача C, задача A, зависимости упорядочиваются в алфавитном порядке, что кажется немного странным - person AgentRegEdit; 30.01.2012
comment
В ваших примерах порядок между taskB и taskC undefined, и Gradle может выбирать любой порядок. - person Peter Niederwieser; 01.02.2012
comment
Но если я не всегда хочу, чтобы задача B зависела от задачи C, скажем, например, иногда я хочу, чтобы задача B выполнялась одна или имела еще один шаг между задачей C и задачей B, нет ли способа сделать это? Кажется несколько нелогичным, что gradle пойдет дальше и выберет любой порядок, который ему кажется, учитывая, что синтаксис dependOn основан на массиве, поэтому порядок кажется подразумеваемым. - person AgentRegEdit; 06.02.2012
comment
Это кажется нелогичным, потому что вы привыкли к такому поведению Ant. Gradle в настоящее время не имеет программных зависимостей, таких как Ant. - person Peter Niederwieser; 07.02.2012
comment
Тогда как вы можете условно вызывать задачи из методов? - person IgorGanapolsky; 11.07.2016

Я нашел обходной путь, чтобы сделать это. В моем сценарии у меня есть задача, которая считывает пользовательский ввод, и в зависимости от его ответа мне нужно создать EAR с различными конфигурациями. Я использовал задачу типа GradleBuild. Вот код:

task createEar() << {   
    def wichTypeOfEar = System.console().readLine("Which EAR?? (a, b)\n")    
    if(wichTypeOfEar == 'a'){
        tasks.earA.execute()
    }else{
        tasks.earB.execute()
    }    
}

task earA(type: GradleBuild) {
    doFirst{
       // Here I can do some stuffs related to ear A
    }
    tasks = ['ear']
}

task earB(type: GradleBuild) {
    doFirst{
       // Here I can do some stuffs related to ear B
    }
    tasks = ['ear']
}

ear {
   //Here is the common built in EAR task from 'ear' plugin
}

В вашем случае вы можете сделать следующее:

task testNGTests(type: Test) {
    useTestNG()    
}

task testNGTestsWrapper(type: GradleBuild){
    tasks = ['testNGTests']
}

task taskA {
    doFirst {
    testNGTestsWrapper.execute()
    }
}
person carlosgarbiatti    schedule 13.12.2012
comment
Почему вам нужно добавить tasks. перед выполнением? - person IgorGanapolsky; 11.07.2016