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

时间:2019-06-19 03:32:17

标签: gradle kotlin

我有一个Gradle任务,可以创建100MB JAR。现在,如果项目中的代码已更改(例如特定的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")
    }
}

关于如何实现这一目标的任何想法?

谢谢

p.s。 作为背景,我正在努力改善构建时间。我已经为我的gradle.properties找到了两件事:

org.gradle.parallel=true
org.gradle.caching=true

1 个答案:

答案 0 :(得分:2)

通常,如果您想告诉任务如何知道它是否是最新的,则需要定义inputsoutputs。这些是告诉Gradle任务是否最新的信息。如果自从上次运行任务以来输入或输出没有任何变化,Gradle就会知道它是最新的,并且不会重新执行任务。

在您的情况下,输入将是源文件夹,而输出将是jar。 Gradle文档here中对此进行了解释。您可以在this文章中看到一个示例,该示例显示了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 ...")
    }
}

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

  

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

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