在gradle(1.9)中,我有多个子项目。每个人都使用应用程序插件来创建tar和cli。我试图让所有这些焦油成为一个统一的焦油,但我遇到了很多麻烦。
这是我要找的tar格式:
${project.name}/${subproject.name}.tar
我已经尝试过使用Tar任务和分发插件,但是对于每一个,我都找不到一个干净的方法来获取生成的tars(或任何tar),并将它们放在顶层,不包括其他一切。
这是一个使用distirbution pluging的示例,但它没有给出我喜欢的输出
apply plugin: 'distribution'
distributions {
testing {
contents {
from(".")
exclude "*src*"
exclude "*idea*"
exclude "*.jar"
exclude ".MF"
filesMatching("**/build/distributions/*.tar") {
if(file.name == "${project.name}-testing.tar") {
exclude()
} else {
name file.name
}
}
}
}
}
这是我想要的(但没有工作):
apply plugin: 'distribution'
distributions {
testing {
contents {
include "**/*.tar" // shows up at top level
}
}
}
编辑: 越来越近了。
distributions {
testing {
contents {
from subprojects.buildDir
includeEmptyDirs false
include "**/*.tar"
exclude "**/${project.name}-testing.tar"
}
}
}
这将给我$ {project.name} / distribution / $ {subproject.name} .tar
答案 0 :(得分:2)
以下是您的问题的解决方案。将以下内容放在根项目中:
task distTar(type: Tar) {
destinationDir = new File("$buildDir/distributions")
baseName = 'unifiedTar'
}
subprojects {
// definitions common to subprojects...
afterEvaluate {
def distTar = tasks.findByName('distTar')
if(distTar) {
rootProject.distTar.dependsOn distTar
rootProject.distTar.inputs.file distTar.archivePath
rootProject.distTar.from distTar.archivePath
}
}
}
然后在根项目上调用“build distTar” - 它将在“build / distributions”子文件夹(根项目)中汇编“unifiedTar.tar”。
工作原理:
“task distTar(...)”在根项目中声明了一个类型为Tar的新任务。
“子项目”将指定的闭包应用于每个子项目。
“afterEvaluate”确保在评估当前项目(在本例中为子项目)之后调用指定的闭包。这非常重要,因为我们将使用子项目的属性,这些属性仅在评估后定义。
“tasks.findByName”允许我们确定是否为给定项目定义了给定任务。如果不是,则返回null并且不执行以下代码。这样我们就子项目的性质保持不可知。
“dependsOn”确保根项目的distTar取决于给定项目的distTar(因此,执行时间晚于它)。
“inputs.file”确保如果没有组成的焦点发生变化,则不会执行根项目中的distTar。
“from”将成分tar添加到统一的tar。