Не могу использовать дополнительные свойства проекта в блоке плагинов

У меня многопроектная сборка, и чаще всего я блокирую версии для артефактов по всем направлениям. Так что в моем корневом проекте я определяю что-то вроде:

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")}")
}

Официальные документы

Другие вопросы по тегам