我正在尝试使用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另一方面,只运行它所设置的任务时生效.这就解释了为什么flywayClean并removeTestDatabasContainer在我执行时运行gradle flywayMigrate.
我仍然在努力gradle testEverything工作,因为它在上面做,同时gradle flywayMigrate只是执行flywayMigrate.
感谢 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)
| 归档时间: |
|
| 查看次数: |
5130 次 |
| 最近记录: |