Gradle - 仅在目录中的代码发生更改时才执行任务

use*_*od2 6 gradle kotlin

我有一个创建 100MB JAR 的 Gradle 任务。现在我只希望将其创建为gradle build项目内代码已更改(例如特定./src目录)的一部分。

所以目前 build.gradle.kts 看起来像:

tasks {
    "shadowJar"(ShadowJar::class) {
        isZip64 = true
        archiveFileName.set("${project.name}.jar")
        dependencies {
            include(dependency(".*:.*:.*"))
            exclude(dependency("org.apache.spark:.*"))
        }
    }
}

tasks {
    "build" {
        dependsOn("shadowJar")
    }
}
Run Code Online (Sandbox Code Playgroud)

关于如何实现这一目标有什么想法吗?

谢谢

ps 作为背景,我正在努力缩短构建时间。我已经为我找到了两件事gradle.properties

org.gradle.parallel=true
org.gradle.caching=true
Run Code Online (Sandbox Code Playgroud)

Yon*_*bbs 5

一般来说,如果你想告诉一个任务如何知道它是否是最新的,你需要定义inputsoutputs。这些是告诉 Gradle 任务是否是最新的。如果自上次运行任务以来输入或输出没有任何变化,Gradle 知道它是最新的并且不会重新执行该任务。

在您的情况下,输入将是源文件夹,输出将是 jar。Gradle 文档对此进行了解释。你可以在这个中看到一个例子,它展示了 Gradle 如何调用 Webpack,但前提是某些内容发生了更改。

所以你可以这样做:

tasks {
    "shadowJar"(ShadowJar::class) {
        // all the stuff you already have, plus these two new lines:
        inputs.dir("... the source dir ...")
        outputs.file("... the generated jar ...")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为shadowTask您正在使用的任务来自这里: https: //github.com/johnrengelman/shadow?如果是这样,您实际上可能不需要直接设置inputsoutputs,因为任务已经自行设置了它们。例如,如果您查看该插件的源代码,您可以看到它注释了一种方法@InputFiles(请参阅此处)。根据文档,这:

将属性标记为指定任务的输入文件。

输出也在超类之一 ( AbstractArchiveTask.getArchiveFile) 中指定。