Не могу использовать дополнительные свойства проекта в блоке плагинов
У меня многопроектная сборка, и чаще всего я блокирую версии для артефактов по всем направлениям. Так что в моем корневом проекте я определяю что-то вроде:
project.extra.set("pkgVersions", mapOf(
"kotlin" to "1.2.0",
"jooq" to "3.10.2"
))
val pkgVersions : Map<String, String> by project.extra
plugins {
base
kotlin("jvm") version "1.2.0" apply false
}
Хотя я могу использовать pkgVersions
где угодно, включая другие подпроекты:
val pkgVersions by rootProject.extra
jooq {
version = pkgVersions["jooq"]
}
Я не могу сделать это внутри блока плагинов:
plugins {
kotlin("jvm") version pkgVersions["kotlin"]
}
Дает мне ошибку "pkgVersions не может быть вызван в этом контексте неявным получателем. Используйте явный, если требуется". Я предполагаю, что это потому, что неявный получатель должен быть впечатление файла JVM? Но вместо этого он использует PluginDependencySpec
, Попытка автозаполнения с this@
показывает только this@plugin
, Это всего лишь длинная догадка от меня. Но какие-нибудь указатели на то, что я должен делать?
Кроме того, пока мы занимаемся этим, есть ли способ создать глобальный тип в gradle-kotlin-dsl
, например:
data class MyBuildType(..)
и сделать это доступным везде без использования buildSrc
? Это довольно просто с buildSrc
и я не против использовать его, но просто интересно.
1 ответ
Судя по всему, это стало возможным недавно, если раньше не было. (Почти) из документов:
gradle.properties
:
helloPluginVersion=1.0.0
settings.gradle.kts
:
pluginManagement {
val helloPluginVersion: String by settings
plugins {
id("com.example.hello") version helloPluginVersion
}
}
И теперь документы говорят, что build.gradle.kts
должно быть пустым, но мое тестирование показывает, что вам все еще нужно это в build.gradle.kts
:
plugins {
id("com.example.hello")
}
Версия теперь определяется settings.gradle.kts
и, следовательно, gradle.properties
чего мы и хотим...
Согласно документации (см. Подраздел " Ограниченный синтаксис")
"Версия плагина" и "идентификатор плагина" должны быть константами, литералами, строками
В следующих параграфах есть несколько других заметок, связанных с вашим вопросом:
Блок plugins {} также должен быть оператором верхнего уровня в buildscript. Он не может быть вложен в другую конструкцию (например, оператор if или цикл for).
Может использоваться только в сценариях сборки
Блок plugins {} в настоящее время может использоваться только в сценарии сборки проекта. Его нельзя использовать в плагинах скриптов, файле settings.gradle или в скриптах инициализации.
В следующих версиях Gradle это ограничение будет снято.
Так что это невозможно сделать сейчас.
Существует обходной путь для извлечения версии плагина и последующего его использования, но я лично нахожу это уродливым и предпочитаю использовать явные версии.
root.gradle.kts root
buildscript {
val kotlinVersion by rootProject.extra { "1.3.10" }
...
}
модульbuild.gradle.kts
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${rootProject.extra.get("kotlinVersion")}")
}