gradle copy as doLast不工作

时间:2016-06-23 01:54:21

标签: android gradle build

我正在尝试做一件非常简单的事情。当gradle在清理时删除build dir中的所有文件我想在创建发行版本时将apks移动到其他地方。所以我在链中添加了一个复制任务,并将其设置为最后一个。我试过的任何东西都不起作用。所以我简化了它并添加了一些日志记录来说明问题。我认为它不起作用。

使用两个变量,我可以检查在任务定义时间和执行时间输入和输出路径是否有效。我还可以检查任务是否已执行。我在输入目录中放了一些文件,以确保在任何情况下都有一些东西。这是脚本:

def buildPath
def outPath
task copyApks(type: Copy) {

    buildPath = "$buildDir\\outputs\\apk"
    outPath ="$buildDir\\outputs\\apk2"

    logger.error("Source Folder is $buildPath")
    logger.error("Destination Folder is $outPath")

    from buildPath
    into outPath
}


assembleRelease.doLast {
    android.applicationVariants.all { variant ->
        println "Variant  $variant.name"
        logger.error("Source Folder is $buildPath")
        logger.error("Destination Folder is $outPath")
        copyApks
    }
}

这是输出,在定义和执行时,可以看到路径是正确的(它们存在且有效)。还可以看到任务已执行:

有什么问题?

Executing external task 'assembleRelease'...
Parallel execution with configuration on demand is an incubating feature.
Source Folder is C:\Users\Administrator\Projects\Gradle\MB6\app\build\outputs\apk
Destination Folder is C:\Users\Administrator\Projects\Gradle\MB6\app\build\outputs\apk2
................
some other gradle logs
................
:app:assembleRelease
Variant  debug
Source Folder is C:\Users\Administrator\Projects\Gradle\MB6\app\build\outputs\apk
Destination Folder is C:\Users\Administrator\Projects\Gradle\MB6\app\build\outputs\apk2
Variant  release
Source Folder is C:\Users\Administrator\Projects\Gradle\MB6\app\build\outputs\apk
Destination Folder is C:\Users\Administrator\Projects\Gradle\MB6\app\build\outputs\apk2

BUILD SUCCESSFUL

1 个答案:

答案 0 :(得分:3)

首先,您必须知道,只是将任务名称添加到您的闭包中,在您的情况下它是copyApks,并不意味着应该执行此任务。它就像你指定一个变量一样,但对它没有任何作用。

还有一个,请注意,两个变体路径是相同的,这意味着您尝试将相同的文件复制两次。实际上,这并不是唯一的原因,您必须了解,在配置阶段,当您尝试在执行阶段调用它时,您的复制任务已配置,因此您无法将其更改为参数,并且此任务将始终表现相同。

如果您想一个接一个地调用某些任务,您有许多选择,例如任务依赖性,任务完成或任务排序。您可以在official user guide中阅读相关内容。有一种方法可以像调用方法一样调用某个任务,但这是一个非常糟糕的解决方案,你必须避免使用它。

因此,如果您想调用复制任务,那么您可以尝试这样的解决方案

assembleRelease.finalizedBy copyApks

每次组装完成后,这将始终调用复制任务。