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

标签 gradle gradle-kotlin-dsl

最后一条评论在 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 之间切换。

关于Gradle kotlin dsl - 如何指定重复任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60838336/

相关文章:

spring-mvc - 由于 TestRestTemplate 和 apache SSL,Spring Boot Integration 无法启动

unity3d - Gradle构建在Unity2018中失败

android - Android Studio终端无法安装gradlew

android - 无效的LOC header (错误的签名)

android - Kotlin DSL 构建脚本依赖更新

android - 进程无法访问该文件,因为该文件正在被另一个进程使用 [Android] [Gradle]

gradle - Gradle中扩展和额外属性之间的区别

gradle - 如何将 testOptions.unitTests.all 转换为 gradle Kotlin dsl

gradle-kotlin-dsl - 如何将项目中的 sourceSet 转换为 kotlin kts

android - 为什么其中一些来自同一个库的导入会作为未解析的引用返回?