基本 Gradle 复制任务不起作用(直到直接调用)
Basic Gradle copy-task not working (until directly called)
我有一个简单的 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 执行构建脚本时有两个主要阶段:配置阶段和执行阶段。整个构建脚本将在配置阶段被评估(执行),只有任务操作(例如复制 Copy
任务)、doFirst
和 doLast
所选任务的关闭将在期间执行执行阶段。所选任务由命令行参数和任务依赖关系确定。
结论是,'starting ...'
输出是在配置任务 copyAll
时打印的,而不是在启动时打印的!
最后但同样重要的是,mkdir
命令引起了混淆,因为它不是 Project
实例的 Copy
task, but a method 的一部分。它在调用时直接执行,因此在您的情况下直接在配置阶段执行,完全独立于任何任务执行。每次执行Gradle.
都会执行
但是,要听到一些好消息,您根本不需要它。 Copy
任务将自行创建所有必需的目标目录。
现在,总结以上所有要点,我们提出以下构建脚本:
task copyAll {
dependsOn 'copyA'
}
task copyA(type: Copy) {
from 'src'
into 'web'
}
我有一个简单的 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 执行构建脚本时有两个主要阶段:配置阶段和执行阶段。整个构建脚本将在配置阶段被评估(执行),只有任务操作(例如复制 Copy
任务)、doFirst
和 doLast
所选任务的关闭将在期间执行执行阶段。所选任务由命令行参数和任务依赖关系确定。
结论是,'starting ...'
输出是在配置任务 copyAll
时打印的,而不是在启动时打印的!
最后但同样重要的是,mkdir
命令引起了混淆,因为它不是 Project
实例的 Copy
task, but a method 的一部分。它在调用时直接执行,因此在您的情况下直接在配置阶段执行,完全独立于任何任务执行。每次执行Gradle.
但是,要听到一些好消息,您根本不需要它。 Copy
任务将自行创建所有必需的目标目录。
现在,总结以上所有要点,我们提出以下构建脚本:
task copyAll {
dependsOn 'copyA'
}
task copyA(type: Copy) {
from 'src'
into 'web'
}