gradle - 与eachFile的Gradle Copy任务if子句不一致,我在做什么错?

标签 gradle groovy build.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目录中,除非已经存在一个具有相同名称的文件,除非它是快照。

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

不一致的是,当至少有一个文件丢失时(无论它是否是快照都无关紧要),然后突然所有快照都会被覆盖,但非快照会被覆盖。

因此,当缺少至少一个文件时,脚本将按预期运行,但是当所有文件都存在时,它将忽略if子句的一半表达式。

几乎就像它使整个文件集的“exists()”表达式短路一样。

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

最佳答案

似乎与此有关:gradle issue 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()
            }
        }
    }
}

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

关于gradle - 与eachFile的Gradle Copy任务if子句不一致,我在做什么错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986777/

相关文章:

Jenkins 并行脚本在循环中使用错误的变量

java - Grails 导入 groovy http 构建器

jenkins - 如何在 jenkins 管道中使用 java 库?

android - 在 Android Studio 中连接到 Firebase 的 Gradle 的当前版本是什么?

Android Studio - 无法通知项目评估监听器错误

android - Gradle:DefaultAndroidSourceDirectorySet to File using toString() 方法已被弃用

groovy - Gradle zip 插件,如何在 zip 中创建空文件夹?

android - 已启用 Multidex - 仍然无法合并 dex

java - Gradle - 获取依赖项的最新版本

android - 将Gradle项目导入Android Studio时出错