Gradle kotlin dsl - 如何指定重复任务?

Gradle kotlin dsl - how to specify duplicate tasks?

https://github.com/johnrengelman/shadow/issues/138最后的评论有一个定义多个shadowJars的例子。我尝试想出一个适用于 kotlin DSL 的版本,但没有成功。它应该是什么样子?

我最近的(几次)尝试如下,但它不起作用,因为我不允许直接实例化任务。 (我是 gradle 的新手,所以我可能在概念上遗漏了一些东西。)

tasks {
    val internal = ShadowJar()
    internal.isZip64 = true
    internal.archiveFileName.set("internal.jar")
    internal.mergeServiceFiles()
    internal.manifest {
        attributes(mapOf("Main-Class" to "com.foo.InternalApplication"))
    }
    internal.minimize()

    val external = ShadowJar()
    external.isZip64 = true
    external.archiveFileName.set("external.jar")
    external.mergeServiceFiles()
    external.manifest {
        attributes(mapOf("Main-Class" to "com.foo.ExternalApplication"))
    }
    external.minimize()
}

tasks {
    val internal by existing
    val external by existing

    "build" {
        dependsOn(internal)
        dependsOn(external)
    }
}

您是否尝试过定义扩展 ShadowJar 任务类型的新任务?

像这样:

tasks.create<ShadowJar>("internal") {
    isZip64 = true
    archiveFileName.set("internal.jar")
    mergeServiceFiles()
    manifest {
        attributes(mapOf("Main-Class" to "com.foo.InternalApplication"))
    }
    minimize()
}

tasks.create<ShadowJar>("external") {
    isZip64 = true
    archiveFileName.set("external.jar")
    mergeServiceFiles()
    manifest {
        attributes(mapOf("Main-Class" to "com.foo.ExternalApplication"))
    }
    minimize()
}

构建任务应该已经存在。所以我们不想定义一个名称冲突的新任务,所以让我们配置现有的 build 任务来添加新的依赖项,这样每次构建都会发生冲突。

tasks.build {
    dependsOn("internal")
    dependsOn("external")
}

如果您不想在每次构建项目时都生成 jar(这会很多),您可能想要定义一个任务来显式调用 jar。

tasks.create<Exec>("buildJars") {
    dependsOn("internal")
    dependsOn("external")
}

我不在可以对此进行测试的计算机上,因此我根据您的原始代码片段做出了很多假设。但是,这种方法是创建新任务并定义其类型的标准且正确的方法。

您可以在 official docs 上阅读更多相关信息。所有代码片段都有一个选项卡,用于在 Groovy 和 Kotlin 之间切换。