[英]Gradle not running copy task after jar
我正在尝试做这样的事情:
jar {
doLast{
from "build/libs/TheJar.jar"
into "."
}
}
到目前为止,我已经尝试了各种教程,包括这个答案中的所有 forms 但没有奏效。 唯一有效的是调用一个单独的任务,但我想知道为什么我的构造是错误的,为什么我不能在 jar 或 shadowJar 任务之后运行一些东西。
看起来您在链接的帖子中获取了部分答案,并以某种方式将它们混合在一起,而不知道您的最终代码实际上做了什么。
Gradle 中的任务可能有一个类型(例如Copy
, Jar
,...)。 这种类型定义了任务一旦执行就会做什么(所谓的任务动作)。 没有类型的任务在执行时不会做任何事情,除非您手动添加任务操作。 使用doFirst
会将传递的动作(也称为闭包)添加到任务动作列表的开头,使用doLast
会将其添加到列表的末尾。
doFirst
和doLast
闭包之外的所有内容都不是任务执行的一部分,但可用于配置任务:
task example {
doLast {
println "second action"
}
doFirst {
println "first action"
}
println "configuration"
}
使用gradle example
运行上面的代码,您将看到日志消息的顺序为configuration
、 first action
、 second action
。
任务配置将运行,即使稍后不会执行该任务。 即使您调用gradle
(没有任何任务名称作为参数),控制台仍然会打印configuration
。 这是链接问题中的实际问题。
让我们来看看真正的问题:如何复制文件?
好吧,Gradle 提供了两种复制文件的方法。 第一个是任务类型Copy
。 您可以基于此类型创建任务,应用您的配置,然后直接从命令行调用它或使用dependsOn
或finalizedBy
定义任务依赖项:
task copySomeFiles(type: Copy) {
from '...'
into '...'
}
但是,您不想创建额外的任务。 Gradle 还有一个名为copy
的方法,可以在脚本中的任何位置调用它并立即复制文件:
copy {
from '...'
into '...'
}
上面的代码将复制您的文件,但它会在每次 Gradle 执行时复制您的文件(这可能经常发生,例如在使用 IDE 时)。 为了解决这个问题,您可以将您的代码与copy
一起移动到任务操作中,例如在doFirst
或doLast
闭包中:
jar {
doLast {
copy {
from "build/libs/TheJar.jar"
into "."
}
}
}
如您所见,您的代码缺少copy
语句。 现在,每当您的任务jar
被执行时,它的最后一个任务操作将按预期复制文件。
奖励问题:为什么没有错误?
您的“问题”是您的代码是完全有效的 Gradle 代码。 任务jar
的类型是Jar
。 Jar
类型的每个任务都可以使用调用from
和into
的方法进行配置。 方法from
添加文件到 JAR 文件和方法into
将目标目录设置在 JAR 内。 因此,您的代码不是复制,而是配置底层任务jar
。 但是,这没有负面影响,因为此配置在doLast
中应用,它仅在 JAR 文件已创建后运行。 已经发生的事情无法配置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.