Gradle Copy任务最新的确定

时间:2017-03-22 20:06:08

标签: gradle

我比较陌生并试图设置备份任务。我有几个例子,首先我将描述目标:

我在目录中有许多文件(称之为“数据目录”)。当修改此数据目录中的任何文件的内容时,我想在“备份位置”中创建一个新目录,并将数据目录中的每个文件复制到刚刚创建的目录中。创建的目录名称将包含当前日期和时间。目前,数据目录不包含子目录。

当“数据目录”包含一个文件并且我想要做的就是重命名该文件以包含日期时,我的工作正常。例如:

task copyDocs(type: Copy) {
    from 'src/main/doc/testfile.html'
    into 'build/target/doc'

    rename { String fileName ->
        def date = new Date();
        date.format("YYYY-MM-dd--HH-mm-ss") + " " + fileName
    }
}

这很有效。我可以根据需要多次运行任务“copyDocs”,但如果我实际修改了testfile.html的内容,它只会创建一个新文件。现在,我想扩展它,以便创建一个新目录并将源文件复制到其中,而不是创建一个已重命名的新文件。

task copyDocs(type: Copy) {

    def dateStr = (new Date()).format("YYYY-MM-dd--HH-mm-ss");
    from 'src/main/doc/testfile.html'
    into 'build/target/doc/' + dateStr

}

工作如此之好。虽然创建的目录具有我想要的名称,但问题是每次运行任务时,它都会创建一个新目录并将testfile.html复制到其中,无论该文件是否被修改。

我知道这与“任务输入”等有关,我已经阅读了描述初始化阶段与配置阶段等文档的部分内容。我没有发现的任何具体内容足以让我理解为什么复制任务认为它需要在第二种情况下重新运行而不是在第一种情况下重新运行。

简而言之,在这两种情况下,每次运行任务时潜在的输出文件都会随着日期/时间的变化而变化。在任一任务的情况下,输入文件都不会更改。那么为什么第二项任务需要每次都重新运行,而不是第一项任务呢?是否有一种直接的方法来“调试”gradle,以便它明确告诉我为什么会这样?

非常感谢您的时间和帮助,我有兴趣了解gradle,因为它似乎是一个有效的现代构建系统!

1 个答案:

答案 0 :(得分:3)

当涉及到copy任务时,它是否将被执行由在配置阶段设置的任务的输入和输出决定(参见here)。由于在配置,每次相位输出都不同:

into 'build/target/doc/' + dateStr

(它取决于秒数,但如果你修剪到几小时,几天,几个月,效果会相同但更罕见),每次执行任务时都会复制文件,即使它没有改变。要解决此问题,您需要在执行时更改目标,这可以通过以下方式完成:

task copyDocs(type: Copy) {

    def dest = 'build/target/doc/'
    from 'src/main/doc/testfile.html'
    into dest
    eachFile { fcp ->
        def dateStr = (new Date()).format("YYYY-MM-dd--HH-mm-ss");
        fcp.path = dest + dateStr
    }
}

这种方式当且仅当from输入不同时才会执行任务。