我有一个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
答案 0 :(得分:2)
通常,如果您想告诉任务如何知道它是否是最新的,则需要定义inputs
和outputs
。这些是告诉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?如果是这样,您实际上可能不需要直接设置inputs
和outputs
,因为任务本身已经设置了它们。例如,如果您查看该插件的源代码,则可以看到它使用@InputFiles
注释了一种方法(请参见here)。根据文档:
将属性标记为指定任务的输入文件。
在超类之一(AbstractArchiveTask.getArchiveFile
)中也指定了输出。