我是Gradle的新手,我想在test
插件的java
任务之前和之后执行两个任务。我们称它们为doBeforeTest
和doAfterTest
。因此,在运行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
。
有没有更好的解决方案?我阅读了一些与任务排序有关的答案,但仍然找不到正确的方法。 谢谢!
答案 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
。您要按顺序执行任务doBeforeTest
,test
和doAfterTest
。您现在可以像这样设置任务:
% 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的逻辑中,任务在执行之前先声明需要的内容。他们没有宣布事后要做的事情。