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

标签 gradle copy mkdir

我有一个简单的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任务),所选任务的doFirstdoLast关闭将在执行阶段执行。根据命令行参数和任务相关性确定所选任务。

结论是,配置任务'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/

相关文章:

android - 程序类型已经存在 : org. apache.commons.logging.Log

c++ - std::copy 是否处理重叠范围?

rsync - 为什么 rsync 使用没有 p 选项的 mkdir

gradle `it` 属性在 `build.gradle` 闭包中

android - 如何处理不同产品 flavor 的 Assets

android - Android Studio Gradle在Android L上设置了目标API

r - 准确理解何时 data.table 是对另一个 data.table 的引用(而不是其副本)

c++ - 将一个元素从 vector 复制到另一 vector

php - 在 PHP 中 0777 中是否需要 0?

node.js - 如何将元数据添加到 mac/linux 上的文件夹