Gradle Kotlin Скрипт, пытающийся назначить classpatch через встроенную переменную - PullRequest
1 голос
/ 29 мая 2020

Почему:

val runVersionSplicer by tasks.registering(type = JavaExec::class) {
    classpath = sourceSets.main.runtimeClasspath // error
    main = "com.concurnas.build.VersionSplicer"
}

возвращает:

Неразрешенная ссылка. Ни один из следующих кандидатов не подходит из-за несоответствия типа получателя: publi c val NamedDomainObjectContainer.runtimeClasspath: NamedDomainObjectProvider, определенный в org.gradle. kotlin .dsl

Хотя вместо этого это работает нормально?

val runVersionSplicer by tasks.registering(type = JavaExec::class) {
    classpath = sourceSets["main"].runtimeClasspath
    main = "com.concurnas.build.VersionSplicer"
}

Я знаю, что sourceSets.main определяется таким образом:

val org.gradle.api.tasks.SourceSetContainer.`main`: NamedDomainObjectProvider<org.gradle.api.tasks.SourceSet>
    get() = named<org.gradle.api.tasks.SourceSet>("main")

Однако не предполагается, что конструкция sourceSets["main"] заменяет конструкцию

1 Ответ

1 голос
/ 31 мая 2020

Потому что один из них является поставщиком, а другой - объектом.

  • sourceSets.main использует NamedDomainObjectCollection.named под капотом, как вы выяснили. Если вы посмотрите на javado c для named, вы увидите, что он возвращает следующее:

    Провайдер, который вернет объект при запросе. Объект может быть создан и настроен на этом этапе, если он еще не

  • sourceSets["main"] возвращает исходный набор напрямую, потому что вместо этого он использует NamedDomainObjectCollection.getByName, whi:

    Объект с заданным именем. Никогда не возвращает значение null.

Итак, эти два эквивалента:

sourceSets.main.get()
sourceSets["main"]

В Groovy следующие эквиваленты:

sourceSets.main
sourceSets["main"]
sourceSets.getAt("main")

Это разные синтаксисы метода getAt, реализованного классом NamedDomainObjectCollection. Вот почему вы не видите много get() в Groovy скриптах, но вы видите намного больше в Kotlin скриптах DSL.

...