Gradle的mustRunAfter/finalized仅适用于特定任务?

L42*_*L42 5 gradle

我正在尝试使用Gradle,mustRunAfter并且finalizedBy只为特定任务工作.举个例子build.gradle:

task removeTestDatabaseContainer {
  doLast {
    println '\ninside removeTestDatabaseContainer\n'
  }
}

task startTestDatabaseContainer {
  doLast {
    println '\ninside startTestDatabaseContainer\n'
  }
  finalizedBy removeTestDatabaseContainer
}

task flywayMigrate { t->
  doLast {
    println '\n inside flywayMigrate\n'
  }
}

task flywayClean { t->
  doLast {
    println '\n inside flywayClean\n'
  }
}

task testEverything {
    dependsOn startTestDatabaseContainer
    dependsOn flywayMigrate
    dependsOn flywayClean

    flywayMigrate.mustRunAfter startTestDatabaseContainer
    flywayMigrate.finalizedBy flywayClean

    flywayClean.mustRunAfter flywayMigrate
    flywayClean.finalizedBy removeTestDatabaseContainer
}
Run Code Online (Sandbox Code Playgroud)

我对如何testEverything运作感到满意.我想要从那个任务得到的输出:

?  gradle testEverything
Parallel execution is an incubating feature.
:startTestDatabaseContainer

inside startTestDatabaseContainer

:flywayMigrate

 inside flywayMigrate

:flywayClean

 inside flywayClean

:removeTestDatabaseContainer

inside removeTestDatabaseContainer

:testEverything

BUILD SUCCESSFUL

Total time: 0.597 secs
Run Code Online (Sandbox Code Playgroud)

但是,当我只运行时,我会遇到flywayMigrate意想不到的问题.这是输出:

?  gradle flywayMigrate                
Parallel execution is an incubating feature.
:flywayMigrate

 inside flywayMigrate

:flywayClean

 inside flywayClean

:removeTestDatabaseContainer

inside removeTestDatabaseContainer


BUILD SUCCESSFUL

Total time: 0.605 secs
Run Code Online (Sandbox Code Playgroud)

这不是我想要的输出.我想只flywayMigrate跑.问题1)我怎样才能完成testEverything工作,同时只gradle flywayMigrate调用flywayMigrate-task?

问题2)
我被告知这与括号内的所有内容task testEverything {}都是配置有关,这一切始终由Gradle处理.因此,任务mustRunAfter/ finalizedBy我在任务中设置将具有"全局效果".但在那种情况下,为什么不gradle flywayMigrate调用startTestDatabaseContainer?(因为任务flywayMigrate.mustRunAfter startTestDatabaseContainer内部的行testEverything.)

编辑:我被引导到Gradle文档中的Ordering任务Finalizer任务,他们回答问题2:mustRunAfter仅在运行两个任务时生效.finalizedBy另一方面,只运行它所设置的任务时生效.这就解释了为什么flywayCleanremoveTestDatabasContainer在我执行时运行gradle flywayMigrate.

我仍然在努力gradle testEverything工作,因为它在上面做,同时gradle flywayMigrate只是执行flywayMigrate.

L42*_*L42 4

感谢 eskatos on #gradle on Freenode 的帮助,我找到了一个解决方案。这只是为了删除我的最终确定的行。更新后的 build.gradle 可以工作:

task removeTestDatabaseContainer {
  doLast {
    println '\ninside removeTestDatabaseContainer\n'
  }
}

task startTestDatabaseContainer {
  doLast {
    println '\ninside startTestDatabaseContainer\n'
  }
  finalizedBy removeTestDatabaseContainer
}

task flywayMigrate { t->
  doLast {
    println '\n inside flywayMigrate\n'
  }
}

task flywayClean { t->
  doLast {
    println '\n inside flywayClean\n'
  }
}

task testEverything {
    dependsOn startTestDatabaseContainer
    dependsOn flywayMigrate
    dependsOn flywayClean

    flywayMigrate.mustRunAfter startTestDatabaseContainer
    //flywayMigrate.finalizedBy flywayClean

    flywayClean.mustRunAfter flywayMigrate
    //flywayClean.finalizedBy removeTestDatabaseContainer
}
Run Code Online (Sandbox Code Playgroud)