Gradle并不真正遵守执行令

时间:2015-01-08 12:24:31

标签: groovy gradle

我有一个Gradle构建3个任务,第一个应该设置部署类型(测试/暂存/生产),秒只是帮助显示当前类型。第三个实现实际部署(实际上对于这个问题不是那么重要)。像这样:

task toTest() {
    project.ext.set('deployType', 'test')
    println "Set deploy type: ${project.deployType}"
}
task showStatus() {
    mustRunAfter = ['toTest', 'toStage', 'toProd']
    println "Curr deploy type: ${project.deployType}"
}
task deploy(dependsOn: [toTest, showStatus]) {
   ...
}

Gradle说它按以下顺序运行的问题:toTest - > showStatus - > deploy。但正如我从控制台看到的那样,它使用了不同的顺序:

////....initial tasks
:buildSrc:build UP-TO-DATE
Curr deploy type: local

Set deploy type: test
:toTest UP-TO-DATE
////.......a lot of other tasks
:showStatus UP-TO-DATE
////... final deployment

我看到两件相反的事情:执行顺序为toTest - > showStatus,但输出首先来自showStatus,然后才来自toTest。这怎么可能?我做错了什么?

Gradle 2.2

PS此外,似乎只忽略了project.ext,或者从其他任务中看不到值。但似乎这是另一个问题的主题。

1 个答案:

答案 0 :(得分:1)

任务定义中的代码只要是&#34; read&#34;就会执行。如果你想完成任务,当任务运行时,#34; last&#34;。 (<<doLast)的简写,例如

task toTest() {
        project.ext.set('deployType', 'test')
}
toTest << {
        println "Set deploy type: ${project.deployType}"
}
task showStatus() {
        mustRunAfter = ['toTest']
}
showStatus << {
        println "Curr deploy type: ${project.deployType}"
}
task lerl(dependsOn: [toTest, showStatus]) {
        println "lerl"
}

给出

lerl
:toTest
Set deploy type: test
:showStatus
Curr deploy type: test
:lerl