mustRunAfter在Gradle多项目中没有任何效果

时间:2014-10-23 14:06:47

标签: gradle

我有一个使用Gradle 2.0的多项目构建,我希望在所有构建任务成功完成后推迟所有发布任务运行,以便全部或不发布任何项目。我尝试使用mustRunAfter,但没有成功。因此,我将设置简化为最小设置:

让我们假设一个gradle多项目构建,包含两个子项目'foo'和'bar',每个子项目都有build.gradle,如下所示:

task 'build'
task 'publish'(dependsOn: build)

这将执行:

$ gradlew publish
:bar:build UP-TO-DATE
:bar:publish UP-TO-DATE
:foo:build UP-TO-DATE
:foo:publish UP-TO-DATE

然后我将以下build.gradle添加到根项目中:

def allBuilds = task build

subprojects {
    afterEvaluate {
        allBuilds.dependsOn build
        publish.mustRunAfter allBuilds
    }
}

但这不会改变执行顺序。

但是,如果我将mustRunAfter更改为dependsOn,执行情况如下:

$ gradlew publish
:bar:build UP-TO-DATE
:foo:build UP-TO-DATE
:build UP-TO-DATE
:bar:publish UP-TO-DATE
:foo:publish UP-TO-DATE

当然缺点是,我无法执行任何子项目:没有所有其他项目的发布:构建被调用。这是针对多项目的mustRunAfter的错误,我做错了还是有更好的替代方法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

问题似乎是,:build任务实际上没有执行,因此mustRunAfter无效。我不得不单独声明所有项目之间的依赖关系,而不是一个根build任务:

subprojects {
    afterEvaluate {
        publish.dependsOn assemble
        publish.mustRunAfter parent.subprojects*.assemble
    }
}

我使用assemble代替build来避免运行所有测试,就像publish一样。