我有一个简单的Gradle脚本:
task copyall(){
println 'starting...'
task copyA(type: Copy) {
mkdir 'web'
from 'src'
into 'web'
}
}
它的行为很奇怪:如果我从命令行调用“gradle copyall”,它会创建目录,但不会将文件从“src”复制到“web”文件夹。
如果我从命令行直接调用task.copyA(“gradle copyA”)-它既可以制作目录又可以复制文件(带有子文件夹)。
为什么task.copyA仅部分作为task.copyall的子任务执行?
最佳答案
好吧,我知道为什么您的Gradle脚本会按照您描述的方式运行,但是出于各种原因却会如此。
首先,Gradle中没有子任务。您可以创建任务,也可以定义任务之间的依赖关系。因此,如果仅自己定义任务copyA
(建议的方式),则它就是完全相同的事情:
task copyAll {
println 'starting...'
}
task copyA(type: Copy) {
mkdir 'web'
from 'src'
into 'web'
}
现在您有两个任务,但是任务
copyAll
根本不执行任何操作。甚至您的println
语句也不是,任务是什么,而是它的配置方式:执行构建脚本时,Gradle有两个主要阶段:配置阶段和执行阶段。整个构建脚本将在配置阶段进行评估(执行),并且只有任务 Action (例如,复制
Copy
任务),所选任务的doFirst
和doLast
关闭将在执行阶段执行。根据命令行参数和任务相关性确定所选任务。结论是,配置任务
'starting ...'
时将打印copyAll
输出,而不是在启动时输出!最后但并非最不重要的一点是,
mkdir
命令引起困惑,因为它不是 Copy
任务的一部分,而是Project
实例的method。它在被调用时直接执行,因此在您的情况下直接在配置阶段,完全独立于任何任务执行。每次执行Gradle都会执行它。但是,听到一些好消息,您根本不需要它。
Copy
任务将自行创建所有必需的目标目录。现在,从上面总结所有要点,我们提出了以下构建脚本:
task copyAll {
dependsOn 'copyA'
}
task copyA(type: Copy) {
from 'src'
into 'web'
}
关于gradle - 基本Gradle复制任务不起作用(直到直接调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48234514/