我是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如何才能实现完美的迁移任务
答案 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"
}
}