How to copy to multiple destinations with Gradle copy task?

前端 未结 5 1157
陌清茗
陌清茗 2020-12-05 04:02

I am trying to copy one file to multiple destinations through a Gradle task. I found the following in other websites but I get an ERROR while running this task.



        
相关标签:
5条回答
  • 2020-12-05 04:25

    Here is a general snippet without copySpec for Gradle 4.1. As pointed out the trick is to use a base into and use relative into inside the closures (e.g. from closure).

    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")
        //}
    }
    
    0 讨论(0)
  • 2020-12-05 04:26

    With a Common Destination Base Path

    If your destination paths share a common path prefix (dest_base), then you can use something like this:

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

    Compared to other answers which use the copy method, this approach also retains Gradle’s UP-TO-DATE checks.

    The above snippet would result in output like this:

    dest_base/
    ├── dest1
    │   └── anotherfile.jar
    └── dest2
        └── anotherfile.jar
    
    0 讨论(0)
  • 2020-12-05 04:30

    an alternative way

    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'
        }
    }
    
    0 讨论(0)
  • 2020-12-05 04:31

    no there isn't a way to do that atm. I would create seperate gradle tasks for each target directory

    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/'
    }
    
    0 讨论(0)
  • 2020-12-05 04:42

    If you really want them in one task, you do something like this:

    def filesToCopy = copySpec {
      from 'someFile.jar'
      rename { 'anotherfile.jar' }
    }
    
    task copyFiles << {
      ['dest1', 'dest2'].each { dest ->
        copy {
          with filesToCopy
          into dest
        }
      }
    }
    
    0 讨论(0)
提交回复
热议问题