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

Gradle 如何修改渐变复制任务中的文件列表?,gradle,Gradle,警告:Gradle新手…:-) 我正在将现有项目从Ant转换为Gradle。我的项目的很大一部分由生成的代码组成。此代码生成到内部目录中,并执行本地生成以确保正确生成代码。一旦本地测试构建得到验证,生成的代码将被复制到一组WAR项目中进行最终部署 因此,作为构建的一部分,我有一个任务将文件从测试构建复制到WAR项目。制作副本时,只有在目标WAR项目中不存在一些文件时,才应复制这些文件。为此,我编写了以下Gradle copy任务: task copyServer (type: org.grad

警告:Gradle新手…:-)

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

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


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正在使用的文件树?

永远不要尝试从执行阶段更改任务的配置,尤其是如果这样会更改输入或输出。这将打破最新的检查,我认为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构建脚本,用Gradle的方式从头开始创建你的构建。如果您尝试移植现有的Ant构建,您很可能会得到非常丑陋的Gradle构建,这也可能比它们的效率低得多。

谢谢。这让我到达了我需要的地方。我没有考虑到我可以在配置时修改include的事实。通过在include子句周围添加if语句,我可以控制添加的内容,就像我之前在执行时尝试做的那样…如果文件已经存在,则不复制该文件的用例是什么?如果文件不在目标目录中,则复制该文件(即appFile.exists()==false)是,这就是我所说和询问的目标目录包含服务所需文件的副本。在初始复制时,目标中不存在该文件,因此应复制该文件。完成初始复制后,目标中的文件可能已被手动编辑,因此如果该文件已存在于目标中,则后续复制不应覆盖该文件。