Подтвердить что ты не робот

Как скопировать в несколько пунктов назначения с помощью задачи Gradle copy?

Я пытаюсь скопировать один файл в несколько пунктов назначения с помощью задачи Gradle. Я нашел следующее на других веб-сайтах, но при выполнении этой задачи я получаю ERROR.

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?

4b9b3361

Ответ 1

Если вы действительно хотите, чтобы они были в одной задаче, вы делаете что-то вроде этого:

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

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

Ответ 2

альтернативный способ

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

Ответ 3

нет, нет никакого способа сделать это. Я создавал бы отдельные задачи gradle для каждого целевого каталога

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

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

with filesToCopyDest2  {
    with filesToCopy
    into 'dest2/'
}

Ответ 4

С общим базовым контуром назначения

Если ваши пути назначения имеют общий префикс пути (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, этот подход также сохраняет проверки UP-TO-DATE Gradle.

Вышеприведенный фрагмент приведет к выводу следующего вида:

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

Ответ 5

Вот общий фрагмент без copySpec для Gradle 4.1. Как указывалось, трюк состоит в том, чтобы использовать основание и использовать его относительно внутри затворов (например, от закрытия).

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")
    //}
}