Как использовать версию плагина из gradle.properties в Gradle Kotlin DSL?

Теперь я использую этот способ:

plugins {
    val kotlinVersion: String by project
    val springBootPluginVersion: String by project
    val springDependencyManagementPluginVersion: String by project

    id("org.jetbrains.kotlin.plugin.allopen") version kotlinVersion
    id("org.jetbrains.kotlin.jvm") version kotlinVersion
    id("org.springframework.boot") version springBootPluginVersion
    id("io.spring.dependency-management") version springDependencyManagementPluginVersion
}

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

'val Build_gradle.project: Project' can't be called in this context by implicit receiver. Use the explicit one if necessary

person Roman Q    schedule 14.10.2018    source источник


Ответы (2)


Есть пара проблем, которые имеют некоторые детали по этому поводу:

Способ сделать это в самых последних версиях Gradle — использовать settings.gradle или settings.gradle.kts и блок pluginManagement {}.

В вашем случае это может выглядеть так:

pluginManagement {
  resolutionStrategy {
    eachPlugin {
      when (requested.id.id) {
        "org.jetbrains.kotlin.plugin.allopen" -> {
          val kotlinVersion: String by settings
          useVersion(kotlinVersion)
        }
        "org.jetbrains.kotlin.jvm" -> {
          val kotlinVersion: String by settings
          useVersion(kotlinVersion)
        }
        "org.springframework.boot" -> {
          val springBootPluginVersion: String by settings
          useVersion(springBootPluginVersion)
        }
        "io.spring.dependency-management" -> {
          val springDependencyManagementPluginVersion: String by settings
          useVersion(springDependencyManagementPluginVersion)
        }
      }
    }
  }
}
person mkobit    schedule 15.10.2018
comment
Спасибо. Этот код кажется многословным, но, вероятно, это лучше, чем определять переменную для каждого плагина в каждом модуле. - person Roman Q; 16.10.2018
comment
Я использовал этот подход с некоторыми изменениями, см. github.com/rkudryashov/microservices-example. - person Roman Q; 26.01.2019

(Кросс-пост: источник)

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

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