收集父项目的构建目录中的文件

时间:2019-08-06 20:14:37

标签: gradle

我在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)

但是,在两种情况下都没有任何反应。没有文件被复制。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我可以看到您做错了两件事:

  1. 您具有子项目的相对路径。不建议这样做,因为这意味着您将始终必须从根文件夹中调用Gradle。如果Gradle守护进程从其他地方启动,它将失败。您可以使用rootDir属性(例如,来自“ $ 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)。但是我更喜欢直接访问任务的简便性,而不是通过配置为模型建模的冗长而复杂的方式。我们希望它在以后的发行版中变得更简单。