【问题标题】:gradle copy as doLast not workinggradle copy as doLast 不工作
【发布时间】:2016-10-25 03:55:32
【问题描述】:

我正在尝试做一件非常简单的事情。由于 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

【问题讨论】:

    标签: android gradle build


    【解决方案1】:

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

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

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

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

    assembleRelease.finalizedBy copyApks
    

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

    【讨论】:

    • Gradle 同步失败:未找到 Gradle DSL 方法:'finalisedBy()'
    • 是的,也拼错了,必须要finalizedBy
    • 啊,现在我知道你不回答问题,你来这里是为了让大家知道你读了一本书......哈哈。有些人很聪明,有些人只是炫耀......我会读完这本书并回复你......没有拼写错误
    • 在澳大利亚,我们有一点习惯,不像美式英语那样使用这些词。对此我深表歉意……我们的英语真的不像你在俄罗斯那样好……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2018-02-14
    相关资源
    最近更新 更多