使用Gradle创建生成后复制任务

使用Gradle创建生成后复制任务,gradle,build.gradle,Gradle,Build.gradle,我正在与Gradle构建生命周期作斗争;特别是在配置和执行阶段之间进行分割。我已经阅读了Gradle手册中的许多章节,并在网上看到了许多想法,但没有找到以下问题的解决方案: 我想运行一个特定的任务,在java库发行版build的末尾生成一个工件,它是运行时配置jars的扁平版本。也就是说,我只想在运行创建工件的特定任务时生成工件 我创建了以下任务: task packageSamplerTask(type: Tar, dependsOn: distTar) { description "

我正在与Gradle构建生命周期作斗争;特别是在
配置
执行
阶段之间进行分割。我已经阅读了Gradle手册中的许多章节,并在网上看到了许多想法,但没有找到以下问题的解决方案:

我想运行一个特定的任务,在
java库发行版
build的末尾生成一个工件,它是
运行时
配置jars的扁平版本。也就是说,我只想在运行创建工件的特定任务时生成工件

我创建了以下任务:

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的
配置
阶段运行。此行为具有以下后果:

  • 无论我从命令行运行哪个任务,此
    packageSamplerTask
    任务始终运行,通常是不必要的;及
  • 如果我清理了项目,那么构建在下一次运行时会失败,因为
    $distsDir
    配置
    阶段不存在(显然)
似乎如果我以这种方式扩展
Copy
任务,我总是会出现这种过早的行为


有没有办法使用
任务声明很好,但是扁平化也需要推迟:

...
from { tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files }
此外,应该以更抽象的方式引用Tar文件。例如:

from { tarTree(distTar.archivePath).files }  

首先,您的任务不是在
配置阶段执行的,而是像在该阶段配置的每个任务一样。您的闭包只是任务的配置(配置闭包,而不是操作闭包)。这就是代码在配置阶段“执行”的原因

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


为了确保生成不会因为缺少文件夹而失败,可以使用
distsDir.mkdirs()创建它

distsDir
来自哪里?@Opal感谢您的关注。
distsDir
变量被设置为Java插件的一部分。您可以在Gradle文档中找到它。感谢您的回答。抱歉,我的问题不清楚。该任务用于从构建中重新打包
运行时
人工制品,包括我自己的代码。简单地使用
distsDir
可以防止任务失败,但每次调用任何任务目标时,任务仍将被执行。我只想在请求时调用此任务,或者作为我请求的某个其他任务的依赖项。根据构建工件的大小,此任务可能会有明显的错误每次运行此任务时对生成运行时间的影响。
...
from { tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files }
from { tarTree(distTar.archivePath).files }