Gradle kotlin dsl - как указать повторяющиеся задачи? - PullRequest
2 голосов
/ 24 марта 2020

Последний комментарий в 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)
    }
}

1 Ответ

2 голосов
/ 24 марта 2020

Вы пытались определить новые задачи, расширяющие тип задачи 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")
}

Я не на компьютер, на котором я могу проверить это, поэтому я делаю довольно много предположений на основе ваших оригинальных фрагментов кода. Однако этот подход является стандартным и правильным способом создания новых задач и определения их типа.

Подробнее об этом можно прочитать здесь, на официальных документах . Все фрагменты кода имеют вкладку для переключения между Groovy и Kotlin.

...