基本 Gradle 复制任务不起作用(直到直接调用)

Rus*_* A. 1 copy mkdir gradle

我有一个简单的 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的子任务部分执行?

Luk*_*fer 5

好吧,我明白为什么你的 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 在执行构建脚本时有两个主要阶段:配置阶段执行阶段。整个构建脚本将在配置阶段进行评估(执行),并且只有任务操作(例如复制任务CopydoFirst以及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)