基本 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 任务)、doFirstdoLast 所选任务的关闭将在期间执行执行阶段。所选任务由命令行参数和任务依赖关系确定。

结论是,'starting ...' 输出是在配置任务 copyAll 时打印的,而不是在启动时打印的!

最后但同样重要的是,mkdir 命令引起了混淆,因为它不是 Project 实例的 Copy task, but a method 的一部分。它在调用时直接执行,因此在您的情况下直接在配置阶段执行,完全独立于任何任务执行。每次执行Gradle.

都会执行

但是,要听到一些好消息,您根本不需要它。 Copy 任务将自行创建所有必需的目标目录。

现在,总结以上所有要点,我们提出以下构建脚本:

task copyAll {
    dependsOn 'copyA'
}

task copyA(type: Copy) {
    from 'src'
    into 'web'
}