动态创建的Copy类型任务始终是UP-TO-DATE

Ser*_*kov 8 gradle build.gradle

我准备了一个非常简单的脚本,它说明了我使用Gradle 1.7看到的问题(需要坚持使用它,因为有些插件还没有支持更新的版本).

我正在尝试动态创建任务,每个任务对应于项目目录中的文件.这样可以正常工作,但是我创建的任务永远不会在我为其分配类型"复制"时执行.

这是我的问题build.gradle:

file('templates').listFiles().each { File f ->

    // THIS LINE DOES NOT WORK
    task "myDist-${f.name}" (type: Copy) {

    // NEXT LINE WORKS
    //task "myDist-${f.name}" {
        doLast {
            println "MYDIST-" + f.name
        }
    }
}

task distAll(dependsOn: tasks.matching { Task task -> task.name.startsWith("myDist")}) {
    println "MYDISTALL"
}

defaultTasks 'distAll'
Run Code Online (Sandbox Code Playgroud)

通过这种方式,当我简单地调用默认任务调用时,我的任务不会被执行gradle:

MYDISTALL
:myDist-template1 UP-TO-DATE
:myDist-template2 UP-TO-DATE
:distAll UP-TO-DATE

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

如果我Copy从动态任务中删除类型(取消注释上面的行),我的任务就会被执行:

MYDISTALL
:myDist-template1
MYDIST-template1
:myDist-template2
MYDIST-template2
:distAll

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

(您需要templates在所在的同一目录中创建一个文件夹名称build.gradle,并将几个空文件放入其中以便运行测试)

根据调试输出:

跳过任务':myDist-template1',因为它没有源文件.

跳过任务':myDist-template2',因为它没有源文件.

那么如何指定源文件并使我的Copy任务执行?我试过添加

from( '/absolute/path/to/existing/file' ) {
    into 'myfolder'
}
Run Code Online (Sandbox Code Playgroud)

对于任务组,我已经尝试分配任务inputs.source file('/my/existing/file')没有成功.你能否告诉我如何修改我的简单脚本,让动态任务创建并保持我的动态任务类型Copy

谢谢!

编辑:好的,这样就可以调用任务:

file('templates').listFiles().each { File f ->
    task "myDist-${f.name}" (type: Copy) {
        from f
        into 'dist'
        doLast {
            println "MYDIST-" + f.name
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它看起来我必须始终指定from/ into.在doLast {}体中这样做是不够的.

Pet*_*ser 12

一个Copy任务,只有同时具备东西复制得到执行.告诉它要复制什么是配置任务的一部分,因此需要在配置阶段而不是执行阶段完成.这些是非常重要的概念,您可以在Gradle用户指南Gradle论坛中阅读这些概念.

doFirst并且doLast块在执行阶段执行,作为执行任务的一部分.两者都来不及告诉任务要复制什么:doFirst在主任务操作之前立即执行(在这种情况下是复制),但是(很快)在skippedup-to-date检查之后执行(基于任务的配置).doLast在主要任务动作之后执行,因此显然为时已晚.