我在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)
但是,在两种情况下都没有任何反应。没有文件被复制。
我在做什么错了?
答案 0 :(得分:0)
我可以看到您做错了两件事:
您具有子项目的相对路径。不建议这样做,因为这意味着您将始终必须从根文件夹中调用Gradle。如果Gradle守护进程从其他地方启动,它将失败。您可以使用rootDir
属性(例如,来自“ $ rootDir / ProjectA / ...”的属性)进行修复,但是有更好的方法...
另一个问题是,从根项目中的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)。但是我更喜欢直接访问任务的简便性,而不是通过配置为模型建模的冗长而复杂的方式。我们希望它在以后的发行版中变得更简单。