Gradle 如何使用梯度复制任务复制到多个目标?

Gradle 如何使用梯度复制任务复制到多个目标?,gradle,Gradle,我试图通过Gradle任务将一个文件复制到多个目标。我在其他网站上发现了以下内容,但在运行此任务时出错 def filesToCopy = copySpec{ from 'somefile.jar' rename {String fileName -> 'anotherfile.jar'} } task copyFile(type:Copy) { with filesToCopy { into 'dest1/' } with file

我试图通过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.CopySpeImpl.call()的签名不适用于参数类型


有没有办法在一个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/'
}

如果你真的想让他们参与一项任务,你可以这样做:

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

task copyFiles << {
  ['dest1', 'dest2'].each { dest ->
    copy {
      with filesToCopy
      into dest
    }
  }
}
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
    }
}
def filesToCopy=copySpec{
来自“someFile.jar”
重命名{'anotherfile.jar'}
}
任务副本文件
抄袭{
使用文件目录
进入目的地
}
}
}
另一种方法

task myCustomTask具有公共目标基本路径
如果目标路径共享一个公共路径前缀(
dest\u base
),则可以使用如下内容:

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

task copyFiles << {
  ['dest1', 'dest2'].each { dest ->
    copy {
      with filesToCopy
      into dest
    }
  }
}
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的最新检查

上述代码段将产生如下输出:

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

task copyFiles << {
  ['dest1', 'dest2'].each { dest ->
    copy {
      with filesToCopy
      into dest
    }
  }
}
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
    }
}
dest\u基地/
├── 目的地1
│   └── 另一个文件.jar
└── 目的地2
└── 另一个文件.jar

这是一个没有copySpec的Gradle 4.1通用代码段。正如所指出的,诀窍是在闭包内部使用base-into和relative-into(例如from闭包)


+1通过这种方式,您可以保留最新检查的好处(如其他一些答案所建议的那样,直接调用copy()方法可能会失去这种好处)@dnault我没有提到这一点,但肯定是一个很好的观点。这是渐变方式+1,应该是公认的答案在哪里使用
filesToCopyDest2
filesToCopyDest2
是一个非常方便的方法。但有一个缺点是,当我在列表中放入扩展变量时:
ext.dispatherlist=['dest1','dest2',…]
;任务使用定义时间值(空),而不是“构建时间”值。这意味着我必须在子项目
build.gradle
文件中重复定义相同的任务。有没有一种方法可以将任务参数化,从而使构建变得更加干燥。哇,我不知道有多个具有各种
CopySpec
s的目标是可能的。我不知道这是否是一些新的Gradle功能,但事实上它是最好的解决方案,因为它提供了最新的检查,并且不会创建多个任务(对于大量的子目录来说这可能会很烦人)。这是一个合适的Gradle解决方案(也是最好的解决方案),因为正如作者所说,它将正确使用Gradle的增量生成缓存,并且仅在输入源文件与输出目标文件不同时生成(复制)输入源文件。这不会回答问题。目标是复制到多个目的地,而不是从多个目的地复制。这一个应该是最重要的答案。它唯一的缺陷是,它要求目标路径具有相同的根,这在大多数情况下不应该是问题。这非常有效,它能够将多个文件复制到多个目标。要仅复制一个文件,请在所有
from()
不适用于gradle 6.3中使用相同的文件路径