如何使用Gradle复制任务复制到多个目的地?

时间:2012-11-20 06:10:33

标签: gradle

我正在尝试通过Gradle任务将一个文件复制到多个目标。我在其他网站上发现了以下内容,但在运行此任务时出现了错误。

def filesToCopy = copySpec{
    from 'somefile.jar'
    rename {String fileName -> 'anotherfile.jar'}
}

task copyFile(type:Copy) {
    with filesToCopy  {
      into 'dest1/'
    }
    with filesToCopy  {
      into 'dest2/'
    }
}
  

错误

     

没有方法签名:org.gradle.api.internal.file.copy.CopySpecImpl.call()适用于参数类型

有没有办法在一个Gradle任务中复制到多个目的地?

5 个答案:

答案 0 :(得分:35)

如果你真的希望他们完成一项任务,你可以这样做:

def filesToCopy = copySpec {
  from 'someFile.jar'
  rename { 'anotherfile.jar' }
}

task copyFiles << {
  ['dest1', 'dest2'].each { dest ->
    copy {
      with filesToCopy
      into dest
    }
  }
}

答案 1 :(得分:31)

另一种方式

task myCustomTask << {

    copy {
        from 'sourcePath/folderA'
        into 'targetPath/folderA'
    }

    copy {
        from 'sourcePath/folderB'
        into 'targetPath/folderB'
    }

    copy {
        from 'sourcePath/fileA.java','sourcePath/fileB.java'
        into 'targetPath/folderC'
    }
}

答案 2 :(得分:10)

没有#39;没有办法做那个atm。我会为每个目标目录创建单独的gradle任务

def filesToCopy = copySpec{
    from 'somefile.jar'
    rename {String fileName -> 'anotherfile.jar'}
}

task copyFileDest1(type:Copy) {
    with filesToCopy
    into 'dest1/'
}

task filesToCopyDest2(type:Copy)  {
    with filesToCopy
    into 'dest2/'
}

答案 3 :(得分:9)

使用公共目标基本路径

如果您的目标路径共享一个公共路径前缀(dest_base),那么您可以使用以下内容:

def filesToCopy = copySpec {
    from 'somefile.jar'
    rename { String fileName -> 'anotherfile.jar' }
}

task copyFile(type: Copy) {
    into 'dest_base'
    into('dest1') {
      with filesToCopy
    }
    into('dest2') {
      with filesToCopy
    }
}

与使用copy方法的其他答案相比,此方法还保留了Gradle的UP-TO-DATE检查。

上面的代码段会产生如下输出:

dest_base/
├── dest1
│   └── anotherfile.jar
└── dest2
    └── anotherfile.jar

答案 4 :(得分:8)

以下是Gradle 4.1没有copySpec的一般代码段。正如所指出的那样,诀窍是使用一个base并在闭包内部使用relative(例如从闭包中)。

task multiIntoCopy(type: Copy){
    into(projectDir) // copy into relative to this

    from("foo"){
        into("copied/foo") // will be projectDir/copied/foo
        // just standard copy stuff
        rename("a.txt", "x.txt")
    }

    from("bar"){
        into("copied/aswell/bar") //  projectDir/copied/copied/aswell/bar
    }

    from("baz") // baz folder content will get copied into projectDir

    //from("/bar"){ // this will mess things up, be very careful with the paths
    //    into("copied/aswell/bar")
    //}
}