如何在Gradle中设置任务的``之前''和``之后''顺序

时间:2019-08-07 09:31:38

标签: gradle

我是Gradle的新手,我想在test插件的java任务之前和之后执行两个任务。我们称它们为doBeforeTestdoAfterTest。因此,在运行gradle build命令时,我具有以下执行顺序:

...
doBeforeTest
test
doAfterTest
...

我编写了以下代码:

task doBeforeTest {
    doFirst() {
        println 'Do before test'
    }
}
task doAfterTest {
    doFirst() {
        println 'Do after test'
    }
}
test.dependsOn doBeforeTest
test.mustRunAfter doBeforeTest
doAfterTest.dependsOn test
doAfterTest.mustRunAfter test

但是我得到了令人惊讶的结果:

doBeforeTest
...
testClasses
test
check
...

doAfterTest根本没有打电话的地方。

添加以下内容后,便可以按预期顺序调用任务:

doBeforeTest.mustRunAfter testClasses
check.dependsOn doAfterTests

当我将doAfterTest设置为依赖于test任务时,我只是想不明白为什么不调用vue create

有没有更好的解决方案?我阅读了一些与任务排序有关的答案,但仍然找不到正确的方法。 谢谢!

1 个答案:

答案 0 :(得分:1)

“执行命令”是什么意思?您通过调用以下命令来运行例如 gradlew:

doBeforeTest
test
doAfterTest

通过gradlew执行吗?

无论如何:

首先,考虑一下您的这种呼叫是否有意义:

test.dependsOn doBeforeTest
test.mustRunAfter doBeforeTest

由于对某些事物的依赖已经暗示,test必须在doBeforeTest之后运行。

doAfterTest在您的第一个测试中未调用,因为您请勿调用。我认为您在理解dependsOn的工作方式方面存在错误。这是一条单向街!这意味着此代码:

doAfterTest.dependsOn test
doAfterTest.mustRunAfter test

... 表示如果执行test,则在{em>之后执行doAfterTest表示,如果执行了doAfterTest,则test将被优先执行。同样,doAfterTest.dependsOn test是足够的语句,在这种情况下,doAferTest.mustRunAfter test不执行任何操作。

如前所述,依赖性是一条单向的街道。如果您希望X发生在之前,那么Y取决于X。在您的示例doBeforeTest中。如果希望X在Y之后发生,则X取决于Y。这意味着,您需要调用链中最后一个任务,然后再调用其所有依赖项。

您可以这样建模:

假设您有一个任务myPipeline。您要按顺序执行任务doBeforeTesttestdoAfterTest。您现在可以像这样设置任务:

% Note: The order of declarations does not matter!
myPipeline.dependsOn test
myPipeline.dependsOn doAfterTest
myPipeline.dependsOn doBeforeTest

test.mustRunAfter doBeforeTest
doAfterTest.mustRunAfter test

您已完成。现在,您调用gradlew myPipeline,而没有其他任务,执行顺序将是您想要的。如果您想省略myPipeline,也可以这样设置doAfterTest

doAfterTest.dependsOn test
doAfterTest.dependsOn doBeforeTest

test.mustRunAfter doBeforeTest

然后,您可以调用gradlew doAfterTest,然后整个管道将按预期执行。

这应该足以让您入门。请记住,依赖关系是单向的。任务 A 可以依赖于任务 B,C,D ,这意味着它们将在 A 之前运行,并且您还可以按以下顺序分配<如果需要,必须执行em> B,C,D 。但是,如果您需要在之后 A上运行某些内容,则需要调用该内容,例如 F ,并使其依赖于 A 。在Gradle的逻辑中,任务在执行之前先声明需要的内容。他们没有宣布事后要做的事情。