【问题标题】:Collect files in build directory of parent project收集父项目构建目录中的文件
【发布时间】:2019-08-08 22:54:57
【问题描述】:

我在 Gradle 中有一个多模块项目

root
-- ProjectA
-- ProjectB

ProjectA 和 ProjectB 都使用应用插件分别在“ProjectA/build/distributions”和“ProjectB/build/distributions”中创建一个 zip。

现在我想将这两个 zip 文件复制到“root/build/distributions”中。

我尝试了各种方法,例如在根项目的 build.gradle 中添加:

subprojects {
    task copyFiles(type: Copy) {
        includeEmptyDirs = true
        from "$buildDir/distributions"
        include '*.zip'
        into "$parent.buildDir/distributions"
    }
    copyFiles.dependsOn(build)
}

或者只是在根项目中添加一个任务:

task copyFiles(type: Copy) {
    from "ProjectA/build/distributions"
    from "ProjectB/build/distributions"
    include "*.zip"
    into "$buildDir/distributions"
}

build.dependsOn(copyFiles)

但是,在这两种情况下,都没有发生任何事情。没有文件被复制。

我做错了什么?

【问题讨论】:

    标签: gradle


    【解决方案1】:

    我可以看出你做错了两件事:

    1. 您有子项目的相对路径。不鼓励这样做,因为这意味着您将始终必须从根文件夹调用 Gradle。如果一个 Gradle 守护进程是从其他地方启动的,它将失败。您可以使用 rootDir 属性(例如 `from "$rootDir/ProjectA/...")修复它,但有更好的方法...

    2. 另一个问题是根项目中的 copyFiles 任务与子项目中所需的 distZip 任务之间没有依赖关系。因此,如果以前尚未构建发行版,则无法保证它会工作(显然不能)。

    要修复它,您可以查看问题“Referencing the outputs of a task in another project in Gradle”,它涵盖了您所询问的更一般的用例。目前有两个答案,都不错。

    所以在你的情况下,你可以这样做:

    task copyFiles(type: Copy) {
        from tasks.getByPath(":ProjectA:distZip").outputs
        from tasks.getByPath(":ProjectB:distZip").outputs
        into "$buildDir/distributions"
    }
    

    或者这个:

    task copyFiles(type: Copy) {
        subprojects {
            from(tasks.withType(Zip)) {
                include "*.zip"
            }
        }
        into "$buildDir/distributions"
    }
    

    Gradle 会隐式地使复制任务自动依赖于其他任务,因此您不需要自己这样做。

    还请注意,我引用的问题当前接受的答案是关于配置变体,这可能是建模关系的最正确方法(有关该主题的更多文档,请参阅here)。但我更喜欢直接访问任务的简单性,而不是冗长且可以说更复杂的方式来通过配置对其进行建模。让我们希望它在以后的版本中变得更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2013-04-13
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多