【问题标题】:Gradle Copy task: Ant to gradle migrationGradle Copy 任务:Ant 到 gradle 迁移
【发布时间】:2017-07-14 02:49:24
【问题描述】:

我是 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'
}

我需要知道文件集和详细信息是如何发挥作用的,以使其成为完美的迁移任务

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您需要使用多个 &lt;fileset&gt; 元素,您可以为每个元素添加一个子 CopySpec,例如通过使用from 方法,然后使用闭包。这个闭包中的配置只会应用到这个目录下的文件,就像配置单个&lt;fileset&gt;

    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 ..."
        }
    }
    

    【讨论】:

    • 迄今为止我看到的关于 Gradle 的最佳答案,因为它解释了很多关于 Gradle 的细节。
    【解决方案2】:

    @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"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 2013-06-23
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多