Gradle 如何使用梯度复制任务复制到多个目标?
我试图通过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
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中使用相同的文件路径