В чем разница между регистрацией и созданием в Gradle Kotlin DSL

В 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 ответа

Решение

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

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

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

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

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

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

Принятый ответ отличный, но я хочу добавить, что если вы действительно хотите использовать ссылку, созданную 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()
Другие вопросы по тегам