简单的gradle复制任务的奇怪行为

时间:2017-04-20 04:00:30

标签: gradle

我对Copy任务在多个目录中的gradle行为感到困惑。

我打算将所有文件从src/common复制到

  • target/dir1/ps_modules
  • target/dir2/ps_modules
  • target/dir3/ps_modules

以下是build.gradle看起来的样子:

project.ext.dirs = ["dir1", "dir2", "dir3"]

// ensures that ps_modules directory is created before copying
def ensurePsModulesDir() {
  dirs.each {
    def psModules = file("target/$it/ps_modules")
    if (!(psModules.exists())) {
      println("Creating ps_modules directory $psModules as it doesn't exist yet")
      mkdir psModules
    }
  }
}

task copyCommons(type: Copy) {
  doFirst {
    ensurePsModulesDir()
  }

  from("src/common")
  dirs.each {
    into "target/$it/ps_modules"
  }
}

运行命令./gradlew copyCommons的结果非常奇怪。

文件夹创建按预期工作,但内容/文件仅在target/dir3/ps_modules目录中复制。其余两个目录仍为空。

任何帮助都将不胜感激。

以下是作业运行后目标目录树的屏幕抓取:

enter image description here

2 个答案:

答案 0 :(得分:1)

我想你想做点什么:

task copyCommons(type: Copy) {
    dirs.each {
        with copySpec {
            from "src/common"
            into "target/$it/ps_modules"
        }
    }
}

我认为您可以通过此更改摆脱ensurePsModulesDir()

*编辑*

似乎复制任务强制我们设置目标目录。您可能认为设置destinationDir = '.'是正常的,但它用于最新检查,因此任务永远不会被认为是最新的,因此始终会运行。我建议您使用project.copy(...)而不是Copy任务。例如

task copyCommons {
   // setup inputs and outputs manually 
   inputs.dir "src/common"
   dirs.each {
       outputs.dir "target/$it/ps_modules"
   }

   doLast {
       dirs.each { dir ->
           project.copy {
               from  "src/common"
               into "target/$dir/ps_modules"
           } 
       }
   }
}

答案 1 :(得分:0)

您可以为into类型的任务配置单个Copy。在此特定示例中,gradle的行为与预期一致。由于dir3是列表中的最后一个元素,因此它最终被配置为目标。请查看this问题 - 您可以找到有用的问题。同样this线程也可能有用。