Gradle Copy任务:Ant到gradle迁移

时间:2017-07-14 02:49:25

标签: gradle ant build.gradle gradle-plugin gradle-eclipse

我是gradle并将ant build.xml脚本迁移到gradle的新手。通常复制任务相当简单直接,但我遇到了这个复杂的小任务(也可能很简单),它具有详细启用和文件集。我可以知道如何将此ant代码转换为gradle任务吗?

<copy todir="client" verbose="true">
        <fileset dir="${build.classes}">
        <include name="com/corp/domain/**" />                   
      </fileset>
   </copy>

到目前为止我试图写的Gradle任务是

task copyDocs(type: Copy) {
  from 'dist'
  include "com/corp/domain/**"
  into 'client'
}

我需要知道fileset和verbose如何才能实现完美的迁移任务

2 个答案:

答案 0 :(得分:1)

你的Gradle任务几乎已经做好了一切。 Ant中的<fileset>是一组文件。使用dir=,您可以从一个目录开始,包含或排除此目录中所有文件的子集。 Gradle Copy任务已实现此行为,因为它实现了CopySpec接口。因此,对于只有一个Ant <fileset>,您可以使用Copy任务及其方法,就像您在示例中所做的那样:

task copyDocs(type: Copy) {
    from 'path/to/dir'
    include 'com/corp/domain/**'
    into 'client'
}

如果您需要使用多个<fileset>元素,则可以为每个元素添加一个子CopySpec,例如使用from方法后跟一个闭包。此闭包中的配置仅适用于此目录中的文件,就像配置单个<fileset>一样:

task copyDocs(type: Copy) {
    from('dir1') {
        include 'foo/bar'
    }
    from('dir2') {
        exclude 'bar/foo'
    }
    into 'dir3'
}

${build.classes}指的是Ant属性。由于Gradle基于Groovy,您可以在不同的地方和方式定义您的属性(例如extra properties),但请注意build是任务的名称,几乎所有Gradle构建中都存在脚本,因此直接使用build.classes可以在build任务的范围内寻找属性:

task copyDocs(type: Copy) {
    // if you defined the property before
    from my.build.classes
    include 'com/corp/domain/**'
    into 'client'
}

verbose属性仅定义是否应在控制台上记录所有文件复制操作。 Gradle不支持通过简单选项进行文件记录,因此我们需要自己实现。幸运的是,Gradle提供了eachFile方法。我们可以传递一个闭包,它为每个复制的文件调用并带有一个FileCopyDetails对象。我不知道Ant如何记录复制的文件,但有一种方法可能如下:

task copyDocs(type: Copy) {
    // ...
    eachFile { details ->
        println "Copying $details.sourcePath to $details.path ..."
    }
}

答案 1 :(得分:-1)

@ronypatil,以下代码可以帮助您解决问题:

task copyDocs(type: Copy) {
    FileTree tree = fileTree("dist")
    tree.include "com/corp/domain/**"

    File toPath = file("client")

    tree.each { File file ->
        from file
        into toPath
        println "copy $file into $toPath"
    }
}