gradle tar包括顶层的嵌套文件

时间:2013-12-24 23:27:51

标签: gradle

在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

1 个答案:

答案 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”。

工作原理:

  1. “task distTar(...)”在根项目中声明了一个类型为Tar的新任务。

  2. “子项目”将指定的闭包应用于每个子项目。

  3. “afterEvaluate”确保在评估当前项目(在本例中为子项目)之后调用指定的闭包。这非常重要,因为我们将使用子项目的属性,这些属性仅在评估后定义。

  4. “tasks.findByName”允许我们确定是否为给定项目定义了给定任务。如果不是,则返回null并且不执行以下代码。这样我们就子项目的性质保持不可知。

  5. “dependsOn”确保根项目的distTar取决于给定项目的distTar(因此,执行时间晚于它)。

  6. “inputs.file”确保如果没有组成的焦点发生变化,则不会执行根项目中的distTar。

  7. “from”将成分tar添加到统一的tar。