60

Gradleタスクを使用して1つのファイルを複数の宛先にコピーしようとしています。他のウェブサイトで以下を見つけましたが、このタスクの実行中にエラーが発生します。

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()は引数タイプに適用可能です

1つのGradleタスクで複数の宛先にコピーする方法はありますか?

4

6 に答える 6

44

本当に1つのタスクでそれらが必要な場合は、次のようにします。

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

task copyFiles << {
  ['dest1', 'dest2'].each { dest ->
    copy {
      with filesToCopy
      into dest
    }
  }
}
于 2012-11-21T13:41:27.630 に答える
44

別の方法

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'
    }
}
于 2014-11-24T14:56:36.687 に答える
22

共通の宛先ベースパスを使用

宛先パスが共通のパスプレフィックス(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の最新のチェックも保持されます。

上記のスニペットは、次のような出力になります。

dest_base/
├── dest1
│   └── anotherfile.jar
└── dest2
    └── anotherfile.jar
于 2017-02-09T09:49:57.880 に答える
22

これは、Gradle4.1のcopySpecを含まない一般的なスニペットです。指摘されているように、トリックは、クロージャの内側にベースを使用し、クロージャの内側に相対を使用することです(たとえば、クロージャから)。

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")
    //}
}
于 2017-09-08T12:04:45.960 に答える
14

いいえ、その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/'
}
于 2012-11-21T10:23:16.053 に答える
0

一連のファイルの特定の文字列を書き換えるために、これを特定の順序で実行する必要がありました。

task copyAtoB(dependsOn: [existingTask]) {
    doLast {
        copy {
            from("folder/a") {
                include "*.java"
            }
            // Have to use a new path for modified files
            into("folder/b")
            filter {
                String line ->
                    line.replaceAll("changeme", "to this")
            }
        }
    }
}

task overwriteFilesInAfromB(dependsOn: [copyAtoB]) {
    doLast {
        copy {
            from("folder/b") {
                include "*.java"
            }
            into("folder/a")
        }
    }
}

// Finally, delete the files in folder B
task deleteB(type: Delete, dependsOn: overwriteFilesInAfromB) {
    delete("folder/b")
}

nextTask.dependsOn(deleteB)

于 2022-02-14T21:33:45.800 に答える