android - gradle copy as doLast 不工作

标签 android gradle build

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

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

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

最佳答案

首先,您必须知道,只是将任务名称添加到您的闭包中,在您的例子中是 copyApks,并不真正意味着应该执行该任务。就像您指定了一个变量,但什么都不做一样。

还有一点,请注意,两个变体路径是相同的,这意味着您正在尝试复制相同的文件两次。实际上,这不是唯一的原因,你必须明白,当你试图在执行阶段调用它时,你的复制任务已经在配置阶段配置好了,所以你不能改变它的 from 和 into 参数,并且此任务将始终表现相同。

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

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

assembleRelease.finalizedBy copyApks

这将在每次组装完成时调用复制任务。

关于android - gradle copy as doLast 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37981044/

相关文章:

scala - 在 Ubuntu 18.04 : `gpg: keyserver receive failed: Invalid argument` 上安装 sbt 时出错

groovy - Gradle:获取传递依赖项并导出到最小的运行时 fat jar

android - Facebook Connect/phonegap - FB.init 调用中的 "nativeInterface"参数,它的作用是什么?

android - JaCoCo Gradle - 排除类并覆盖包含

gradle - Gradle和Spock很少需要运行测试

android - 如何重用 Gradle 中的子模块?

android - Android-播放拨号按钮的声音

android - 将 Dispatcher.Main 与 delay() 一起使用是个好主意吗?

java - 将带有字符串的枚举写入包裹

java - 何时使用 gradle.properties 与 settings.gradle?