我有一个简单的 Gradle 脚本:
task copyall(){
println 'starting...'
task copyA(type: Copy) {
mkdir 'web'
from 'src'
into 'web'
}
}
Run Code Online (Sandbox Code Playgroud)
它的行为很奇怪:如果我从命令行调用“gradle copyall” - 它会创建目录,但不会将文件从“src”复制到“web”文件夹。如果我从命令行直接调用task.copyA(“gradle copyA”) - 它会创建dir并复制文件(带有子文件夹)。
为什么task.copyA仅作为task.copyall的子任务部分执行?
好吧,我明白为什么你的 Gradle 脚本会按照你描述的方式运行,但它的运行方式有多种原因。
首先,Gradle 中不存在子任务这样的东西。您可以创建任务,并且可以定义任务之间的依赖关系,仅此而已。copyA因此,如果您只是自己定义它(推荐的方式),您的任务是完全相同的:
task copyAll {
println 'starting...'
}
task copyA(type: Copy) {
mkdir 'web'
from 'src'
into 'web'
}
Run Code Online (Sandbox Code Playgroud)
现在您有两个任务,但该任务copyAll根本不执行任何操作。即使你的println陈述不是任务的作用,而是它的配置方式:
Gradle 在执行构建脚本时有两个主要阶段:配置阶段和执行阶段。整个构建脚本将在配置阶段进行评估(执行),并且只有任务操作(例如复制任务Copy)doFirst以及doLast选定任务的关闭将在执行阶段执行。所选任务是根据命令行参数和任务依赖性确定的。
总之,'starting ...'输出是在copyAll配置任务时打印的,而不是在启动任务时打印的!
最后但并非最不重要的一点是,该mkdir命令引起了混乱,因为它不是任务的一部分Copy,而是实例的方法Project。它在调用时直接执行,因此在您的情况下直接在配置阶段执行,完全独立于任何任务执行。每次执行 Gradle 时都会执行它。
但是,要听到一些好消息,您根本不需要它。任务Copy将自行创建所有必需的目标目录。
现在,总结上面的所有要点,我们提出以下构建脚本:
task copyAll {
dependsOn 'copyA'
}
task copyA(type: Copy) {
from 'src'
into 'web'
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7826 次 |
| 最近记录: |