В чем разница между регистрацией и созданием в Gradle Kotlin DSL - PullRequest
0 голосов
/ 06 декабря 2018

В Gradle (5.0 +) существует два метода создания, т.е. задач:

tasks {
    val javadocJar by creating(Jar::class) {
        val javadoc by tasks

        from(javadoc)
        classifier = "javadoc"
    }
}

и

tasks {
    val javadocJar by registering(Jar::class) {
        val javadoc by tasks

        from(javadoc)
        classifier = "javadoc"
    }
}

В основном один и тот же API, так в чем же разница?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Принятый ответ - это здорово, но я хочу добавить, что если вы действительно хотите использовать ссылку, созданную вызовом created / registering позже, тогда будет разница в API.Сравните

create<MavenPublication>("main") {
    …

    val sourcesJar by tasks.creating(Jar::class) {
        val sourceSets: SourceSetContainer by project
        from(sourceSets["main"].allJava)
        classifier = "sources"
    }

    artifact(sourcesJar)
}

и

create<MavenPublication>("main") {
    …

    val sourcesJar by tasks.registering(Jar::class) {
        val sourceSets: SourceSetContainer by project
        from(sourceSets["main"].allJava)
        classifier = "sources"
    }

    artifact(sourcesJar.get())
}

В случае регистрации, потому что она ленивая, вам потребуется дополнительный .get() звонок, или вы получите исключение:

* What went wrong:
Cannot convert the provided notation to an object of type MavenArtifact: task ':experiments:sourcesJar'.
The following types/formats are supported:
  - Instances of MavenArtifact.
  - Instances of AbstractArchiveTask, for example jar.
  - Instances of PublishArtifact
  - Maps containing a 'source' entry, for example [source: '/path/to/file', extension: 'zip'].
  - Anything that can be converted to a file, as per Project.file()
0 голосов
/ 06 декабря 2018

См. https://docs.gradle.org/current/userguide/kotlin_dsl.html#using_the_container_api:

tasks.named("check")                  
tasks.register("myTask1")

Приведенный выше пример основан на API-интерфейсах избегания конфигурации.Если вам нужно или вы хотите легко настроить или зарегистрировать элементы контейнера, просто замените named () на getByName () и register () на create ().

Разница между creating и registering (или create и register в версиях Gradle до 5.0) относится к Task Configuration Avoidance новому API, подробное описание которого здесь (см. этот раздел ):

Как отложить создание задачи?

Эта функция требует, чтобы авторы сборок подписались, перенеся создание задачи из TaskContainer.create (java.lang.String) API для API-интерфейсов TaskContainer.register (java.lang.String).API register (…) регистрирует задачу, которая будет создана позднее, если и только если задача необходима.API create (…) продолжает активно создавать и настраивать задачи при его вызове.

...