如何修改Gradle复制任务中的文件列表?

时间:2017-02-22 15:54:03

标签: gradle

警告:Gradle新手......: - )

我正在将现有项目从Ant转换为Gradle。我的项目的很大一部分由生成的代码组成。此代码生成到内部目录中,并完成本地构建以确保正确生成代码。验证本地测试版本后,生成的代码将复制到一组WAR项目中以进行最终部署。

因此,作为构建的一部分,我有一个任务将文件从测试版本复制到WAR项目。在制作副本时,只有一些文件只有在目标WAR项目中不存在时才能复制。为此,我编写了以下Gradle复制任务:


task copyServer (type: org.gradle.api.tasks.Copy) {
    group = 'ds_copy'

    String serviceRootDir = "${DS_ROOT_DIR}/NDMS_DS_Generated_Services/server_src/${x_dsServiceDir}"
    String serviceDestDir = "${DS_ROOT_DIR}/NDMS_DS_Client/srv_src/${x_dsServiceDir}"

    FileTree setupFiles = fileTree ("$serviceRootDir") {
        include "gen/**/*.java", "request/gen/**.java"
    }

    doFirst {

        File appFile = new File (serviceDestDir, "${dsName}App.java")

        if (appFile.exists () == false)
        {
            setupFiles = fileTree (dir: "$serviceRootDir", include: ["gen/**/*.java", "request/gen/**.java", "${dsName}App.java"])
        }

        println ("Copying service classes for ${dsName} from ${serviceRootDir}")
        println ("Files to copy: ")
        setupFiles.each { println (it) }
        println (setupFiles)
    }

    from (setupFiles)

    into (serviceDestDir)

    doLast {
        println ("Finished copying service classes for ${dsName}")
    }
}

我的问题是我似乎无法从 doFirst 块更新fileTree,以便检查目标中是否存在文件。即使我看到 setupFiles 更新,但是当复制发生时,我在 doFirst 块中添加的文件也不会被复制。

有没有办法修改copyTask正在使用的fileTree?

1 个答案:

答案 0 :(得分:1)

永远不要尝试从执行阶段更改任务配置,尤其是在更改输入或输出时。这将打破最新的检查,我认为Gradle在最近的版本中甚至主动禁止这一点。

创建第二个生成文件的任务,然后通过配置使copyServer任务包含该任务的输出。如果你正确地做了,你甚至不需要显式的任务依赖,因为它应该隐式添加。

实际上你的复制任务应该更像

task copyServer(type: Copy) {
    group = 'ds_copy'

    from serviceRootDir
    into serviceDestDir
    include 'gen/**/*.java'
    include 'request/gen/**.java'
    include "${dsName}App.java"

    doLast {
        println "Finished copying service classes for $dsName"
    }
}

顺便说一下。 Ant的一个提示 - > Gradle转换。学习Gradle,忘记你的Ant buildcript,用Gradle的Gradle方式从头开始创建你的构建。如果您尝试移植现有的Ant构建,那么很可能最终会出现非常难看的Gradle构建,这些构建的效率可能会低得多。