0

我正在尝试做这样的事情:

jar {
  doLast{
    from "build/libs/TheJar.jar"
    into "."
   }
}

到目前为止,我已经尝试了各种教程,包括这个答案的所有形式,但没有奏效。唯一有效的是调用一个单独的任务,但我想知道为什么我的构造是错误的,为什么我不能在 jar 或 shadowJar 任务之后运行一些东西。

4

1 回答 1

1

看起来您在链接的帖子中获取了部分答案,并以某种方式将它们混合在一起,而不知道您的最终代码实际上做了什么。

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。您可以基于此类型创建任务,应用您的配置,然后直接从命令行调用它或使用或定义任务依赖dependsOnfinalizedBy

task copySomeFiles(type: Copy) {
    from '...'
    into '...'
}

但是,您不想创建额外的任务。Gradle 还有一个名为的方法copy,可以在脚本中的任何位置调用,并会立即复制文件:

copy {
    from '...'
    into '...'
}

上面的代码会复制你的文件,但它会在每次 Gradle 执行时复制你的文件(这可能经常发生,例如在使用 IDE 时)。为了解决这个问题,你可以将你的代码移动copy到一个任务动作中,例如在一个doFirstdoLast闭包中:

jar {
    doLast {
        copy {
            from "build/libs/TheJar.jar"
            into "."
        }
    }
}

如您所见,您的代码缺少该copy语句。现在,无论何时jar执行您的任务,它的最后一个任务操作都会按预期复制文件。

奖励问题:为什么没有错误?

您的“问题”是您的代码是完全有效的 Gradle 代码。任务jar是类型Jar。每个类型的任务都Jar可以使用称为from和的方法进行配置into。该方法from将文件添加到 JAR 文件中,并且该方法在 JAR 中into设置目标目录。因此,您的代码不是复制,而是配置底层任务jar。然而,这并没有负面影响,因为这个配置被应用到内部doLast,它只在 JAR 文件被创建后运行。已经发生的事情无法配置。

于 2021-06-09T23:14:14.033 回答