1

查看如下构建文件:

task busted(type: Copy){
    from "${projectDir}/foo"
    into projectDir
    rename 'foo','bar'
    expand(baz:'qux')
}

task alsoBusted(type: Copy){
    from 'foo'
    into projectDir
    rename 'foo','bar'
    expand(baz:'qux')
}

task moreBusted(type: Copy){
    from projectDir
    into projectDir
    include 'foo'
    rename 'foo','bar'
    expand(baz:'qux')
}

task notBusted(type: Copy){
    from 'foo'
    into "${projectDir}/quux"
    rename 'foo','bar'
    expand(baz:'qux')
}

task surprisinglyNotBusted(type: Copy){
    from 'quux'
    into "${projectDir}/quux"
    include 'foo'
    rename 'foo','bar'
    expand(baz:'qux')
}

似乎虽然可以将文件从同一目录复制到同一目录(任务惊奇NotBusted),但无法从projectDir复制到该目录,这会抛出一个很大的IOException:

org.gradle.api.UncheckedIOException: java.io.IOException: 该进程无法访问该文件,因为另一个进程已锁定该文件的一部分

我正在尝试使用 Copy 来做一些简单的模板,这可能不明智,但是这不起作用有什么原因吗?有没有更好的方法来解决它?

蒂亚……

4

2 回答 2

3

这是将文件直接复制到项目目录时的错误。每当任务的输出设置为项目目录时,这似乎是一个问题。例如,以下展示了相同的行为:

task notCopyButStillBusted {
  outputs.dir projectDir

  doLast {
    println "IOException on Windows sadly"
  }
}

到目前为止,我发现的唯一解决方法是定义您自己的复制行为:

task copyWorks {
  inputs.file "/path/to/Makefile"
  outputs.dir "$projectDir/Makefile"

  doLast {
    copy {
      from "/path/to/Makefile"
      into projectDir
    }
  }
}

这适用于显式文件,一次复制多个文件时可能会更难。

您可以投票支持GRADLE-3002以吸引更多关注此错误。

于 2014-10-07T19:00:04.470 回答
1

试试下面

task copyFiles(){
    doLast{
         ant.copy( todir: "c:\temp\destinationfolder" ){
             fileset( dir: "c:\temp\sourcefolder" )
         }
    }

}
于 2016-07-14T14:56:06.210 回答