Gradle 复制任务与每个文件如果子句工作不一致,我做错了什么



这是我的任务

task copyDeps(type: Copy) {
  from configurations.compile
  into 'build/lib'
  eachFile {
    if (it.relativePath.getFile(destinationDir).exists() && !it.relativePath.getFile(destinationDir).getName().contains("SNAPSHOT")) {
      it.exclude()
    }
  }
}

它应该将所有依赖项下载到 build/lib 目录中,除非已经存在具有相同名称的文件,除非它是快照。

但是当所有文件都存在时,快照根本不会被覆盖,而它们应该被覆盖。

不一致的是,当至少缺少 1 个文件时(无论它是否是快照(,突然所有快照都会被覆盖,但非快照不会被覆盖。

因此,当

至少缺少一个文件时,脚本会按预期工作,但是当所有文件都存在时,它只会忽略 if 子句的一半表达式。

这几乎就像它缩短了整组文件的"exists(("表达式。

使用 gradlew 指向 gradle-5.0-bin.zip

似乎与此有关: gradle 问题 4663

复制任务

具有输入和输出的概念,当输入或输出自上次运行以来均未更改时(相同的依赖项列表,目标目录中相同的复制文件列表(,则复制任务被 gradle 视为最新。

找到的替代方案:

task copyDeps() {
    project.copy {
        from configurations.compile
        into 'build/lib'
        eachFile {
            if (it.relativePath.getFile(project.file('build/lib')).exists() && !it.relativePath.getFile(project.file('build/lib')).getName().contains("SNAPSHOT")) {
                it.exclude()
            }
        }
    }
}

不得不进行一些编辑,因为此构造不知道目的地目录。还必须将任务移动到依赖项列表下方,因为它给出了我还不了解的配置错误。

最新更新