繁体   English   中英

Gradle 在 jar 之后未运行复制任务

[英]Gradle not running copy task after jar

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

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

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

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

Gradle 中的任务可能有一个类型(例如CopyJar ,...)。 这种类型定义了任务一旦执行就会做什么(所谓的任务动作)。 没有类型的任务在执行时不会做任何事情,除非您手动添加任务操作。 使用doFirst会将传递的动作(也称为闭包)添加到任务动作列表的开头,使用doLast会将其添加到列表的末尾。

doFirstdoLast闭包之外的所有内容都不是任务执行的一部分,但可用于配置任务:

task example {
    doLast {
        println "second action"
    }
    doFirst {
        println "first action"
    }
    println "configuration"
}

使用gradle example运行上面的代码,您将看到日志消息的顺序为configurationfirst actionsecond 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类型的每个任务都可以使用调用frominto的方法进行配置。 方法from添加文件到 JAR 文件和方法into将目标目录设置在 JAR 内。 因此,您的代码不是复制,而是配置底层任务jar 但是,这没有负面影响,因为此配置在doLast中应用,它仅在 JAR 文件已创建后运行。 已经发生的事情无法配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM