В чем разница между регистрацией и созданием в 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()