我正在尝试做一件非常简单的事情。当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
答案 0 :(得分:3)
首先,您必须知道,只是将任务名称添加到您的闭包中,在您的情况下它是copyApks
,并不意味着应该执行此任务。它就像你指定一个变量一样,但对它没有任何作用。
还有一个,请注意,两个变体路径是相同的,这意味着您尝试将相同的文件复制两次。实际上,这并不是唯一的原因,您必须了解,在配置阶段,当您尝试在执行阶段调用它时,您的复制任务已配置,因此您无法将其更改为参数,并且此任务将始终表现相同。
如果您想一个接一个地调用某些任务,您有许多选择,例如任务依赖性,任务完成或任务排序。您可以在official user guide中阅读相关内容。有一种方法可以像调用方法一样调用某个任务,但这是一个非常糟糕的解决方案,你必须避免使用它。
因此,如果您想调用复制任务,那么您可以尝试这样的解决方案
assembleRelease.finalizedBy copyApks
每次组装完成后,这将始终调用复制任务。