我有一个使用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的错误,我做错了还是有更好的替代方法来实现这个目标?
答案 0 :(得分:1)
问题似乎是,:build
任务实际上没有执行,因此mustRunAfter
无效。我不得不单独声明所有项目之间的依赖关系,而不是一个根build
任务:
subprojects {
afterEvaluate {
publish.dependsOn assemble
publish.mustRunAfter parent.subprojects*.assemble
}
}
我使用assemble
代替build
来避免运行所有测试,就像publish
一样。