Gradle任务依赖顺序

时间:2017-11-30 09:41:59

标签: gradle android-gradle gradle-plugin

我的自定义gradle任务有问题:我想复制我的android jar库并在之后将其重命名为执行'clean build' 以下是我如何定义它:

task('CreateJar', type: Copy, dependsOn: [':mylibmodule:clean', ':mylibmodule:build']){
  doLast {
    from('build/intermediates/bundles/release/')
    into('libs')
    include('classes.jar')
    rename('classes.jar', 'MyLib.jar')
  }
}

问题是在gradle日志结果中,'clean'是在'build'任务之后完成的,因此lib永远不会被复制到目标文件夹:

...
:mylibmodule:testReleaseUnitTest
:mylibmodule:test
:mylibmodule:check
:mylibmodule:build
:mylibmodule:clean
:mylibmodule:CreateJar NO-SOURCE

我也尝试改变'dependsOn:[]'中的任务顺序,但它没有改变任何东西......有没有人知道我的错误在哪里? 提前致谢

1 个答案:

答案 0 :(得分:2)

dependsOn列表不会强加任何排序保证。通常,如果没有其他关系实际上强加了排序保证,则首先执行首先列出的内容。

(一个例子是如果clean取决于build,那么在dependsOn属性中定义它的方式并不重要,因为build将始终如此在clean之前运行。我不清楚这种情况,因此在括号中,只是为了澄清我的意思。)

要确定build之前运行clean的原因为什么我不能在没有看到完整的构建脚本的情况下说出来。从你发布的内容来看,这是不可确定的。

您所追求的可能是clean.shouldRunAfter buildclean.mustRunAfter build,它们定义了排序约束而不添加依赖关系。因此,您可以单独运行每个任务,但如果两个任务都运行,那么它们的顺序将根据您的指定进行定义。这两者之间的差异只有在并行化任务执行时才有意义,那么应该在它们可以并行运行之后运行iirc,必须在不允许的情况下运行。