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

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

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, и я не против его использования, просто интересно.


person Rohan Prabhu    schedule 07.12.2017    source источник


Ответы (3)


Согласно документации (см. подраздел Ограниченный синтаксис).

«версия плагина» и «идентификатор плагина» должны быть постоянными, литеральными, строковыми

В следующих абзацах есть некоторые другие примечания, связанные с вашим вопросом:

Блок plugins {} также должен быть оператором верхнего уровня в скрипте сборки. Он не может быть вложен в другую конструкцию (например, оператор if или цикл for).

Можно использовать только в скриптах сборки

Блок plugins {} в настоящее время можно использовать только в скрипте сборки проекта. Его нельзя использовать в плагинах сценариев, файле settings.gradle или сценариях инициализации.

В будущих версиях Gradle это ограничение будет снято.

Так что сделать это сейчас невозможно.

Существует обходной путь для извлечения версии плагина и последующего ее использования, но я лично нахожу это уродливым и предпочитаю использовать явные версии.

person kropp    schedule 04.01.2018

По-видимому, это стало возможным в последнее время, если это было невозможно в прошлом. (Почти) из документов:

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, чего мы и хотим...

person Peter V. Mørch    schedule 12.08.2020
comment
Что бы я ни пытался, я не могу заставить это работать. Gradle заставляет меня хотеть выбросить свой компьютер из окна - в наши дни я трачу больше времени на исправление мусора Gradle, чем на программирование... - person Mark Keen; 29.12.2020
comment
Я слышу тебя. По моему опыту, это относится ко многим цепочкам инструментов Java. также Интеллидж. Слишком много магии... - person Peter V. Mørch; 29.12.2020
comment
Оглядываясь назад, это было немного разглагольствованием, но, честно говоря, цепочка инструментов сборки должна быть деталью реализации, а не тем, что вы должны часами исправлять или изменять из-за критических изменений и устаревания в gradle.. подождите, это снова превратилось в разглагольствования ... Да, слишком много магии, против которой я не против, лишь бы она была крепкой! Которого, к сожалению, мне не хватает gradle. - person Mark Keen; 29.12.2020

build.gradle.kts корень

buildscript {
  val kotlinVersion by rootProject.extra { "1.3.10" }
  ...
}

Модуль build.gradle.kts

dependencies {
  implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${rootProject.extra.get("kotlinVersion")}")
}

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

person nimelorm    schedule 03.12.2018
comment
Вопрос конкретно о блоке plugins. Там это не работает, к сожалению. - person Adam Millerchip; 31.05.2020
comment
блин, некрасиво однако - person elect; 03.06.2020