我正在尝试做这样的事情:
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 文件被创建后运行。已经发生的事情无法配置。