使用Gradle创建后期构建复制任务

时间:2014-08-10 07:03:32

标签: gradle build.gradle

我正在努力克服Gradle构建生命周期;特别是configurationexecution阶段之间的分割。我已经阅读了Gradle手册中的许多部分,并在网上看到了很多想法,但还没有找到解决以下问题的方法:

我想运行一个特定的任务,在java-library-distribution版本的末尾生成一个工件,这是runtime配置jar的展平版本。也就是说,我只想在运行特定任务来创建工件时生成工件。

我创建了以下任务:

task packageSamplerTask(type: Tar, dependsOn: distTar) {
    description "Packages the build jars including dependencies as a flattened tar file. Artifact: ${distsDir}/${archivesBaseName}-${version}.tar"
    from tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files
    classifier = 'dist'
    into "${distsDir}/${archivesBaseName}-dist-${version}.tar"
}

虽然此任务确实产生了所需的工件,但该任务在gradle的configuration阶段运行。此行为具有以下后果:

  • 无论我从命令行运行哪个任务,这个packageSamplerTask任务总是运行,通常是不必要的;和
  • 如果我clean项目,则下次运行时构建失败,因为在$distsDir阶段(显然)configuration不存在。

看来如果我以这种方式扩展Copy任务,我总会得到这种过早的行为。

有没有办法使用<< closure / doLast声明来获得我想要的内容?或者还有其他我缺少/应该做的事情吗?

更新

经过进一步的工作,我已经澄清了我的要求,并解决了我的问题如下(具体):

  

“我想将我的代码和我的代码的依赖关系打包为可以作为jMeter插件部署的jar的平面存档。然后可以通过解压缩到jMeter lib/ext目录来安装包,因此,包不得包含用于构建和测试的jMeter jar(及其依赖项)“

由于Gradle似乎不支持 Maven-like provided依赖关系管理,因此我为我的包创建了一个新配置,该配置排除了jMeter jar。

configurations {
    jmpackage {
        extendsFrom runtime
        exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_core', version: '2.11'
        exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_java', version: '2.11'
    }
}

然后创建了以下任务(使用Peter Niederwieser的闭包推荐):

task packageSamplerTask(type: Tar, dependsOn: assemble) {
    from { libsDir }
    from { configurations.jmpackage.getAsFileTree() }
    classifier = 'dist'
}

此解决方案似乎有效,它也允许我仅使用Gradle java插件。

2 个答案:

答案 0 :(得分:1)

任务声明很好,但扁平化也需要推迟:

...
from { tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files }

此外,应以更抽象的方式引用Tar文件。例如:

from { tarTree(distTar.archivePath).files }  

答案 1 :(得分:0)

首先,您的任务不会在configuration phase执行,而是像在该阶段配置的每个任务一样。而你的闭包只是你的任务的配置(一个配置闭包,而不是一个Action闭包)。这就是为什么你的代码在配置阶段“执行”的原因。

如果您希望在execution phase中执行代码,则必须将其写入doLast封闭或doFirst。但在您的情况下,最好将其保留在配置闭包中,因为您正在配置任务。

要确保您的构建因丢失文件夹而失败,您可以使用distsDir.mkdirs()创建它。