我正在尝试做这样的事情:
jar {
doLast{
from "build/libs/TheJar.jar"
into "."
}
}
到目前为止,我已经尝试了各种教程,包括这个答案的所有形式,但没有奏效。唯一有效的是调用一个单独的任务,但我想知道为什么我的构造是错误的,为什么我不能在 jar 或 shadowJar 任务之后运行一些东西。
我正在尝试做这样的事情:
jar {
doLast{
from "build/libs/TheJar.jar"
into "."
}
}
到目前为止,我已经尝试了各种教程,包括这个答案的所有形式,但没有奏效。唯一有效的是调用一个单独的任务,但我想知道为什么我的构造是错误的,为什么我不能在 jar 或 shadowJar 任务之后运行一些东西。
看起来您在链接的帖子中获取了部分答案,并以某种方式将它们混合在一起,而不知道您的最终代码实际上做了什么。
Gradle 中的任务可能有一个类型(例如Copy
, Jar
, ...)。这种类型定义了任务一旦执行就会做什么(所谓的任务动作)。没有类型的任务在执行时不会做任何事情,除非您手动添加任务操作。UsingdoFirst
会将传递的操作(也称为闭包)添加到任务操作列表的开头,使用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 文件中,并且该方法在 JAR 中into
设置目标目录。因此,您的代码不是复制,而是配置底层任务jar
。然而,这并没有负面影响,因为这个配置被应用到内部doLast
,它只在 JAR 文件被创建后运行。已经发生的事情无法配置。