我正在努力克服Gradle构建生命周期;特别是configuration
和execution
阶段之间的分割。我已经阅读了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
插件。
答案 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()
创建它。