Как получить переменные ext.* В блок плагинов в build.gradle.kts
Мой файл сборки выглядит так:
val nexusBaseUri: String by extra
val gradle_version: String by extra
val kotlin_version: String by extra
buildscript {
val nexusBaseUri by extra { "https://mynexusserver/nexus" }
val gradle_version by extra { "4.1" }
val kotlin_version by extra { "1.1.4-3" }
val springBoot_version by extra { "2.0.0.M3" }
repositories {
maven { url = uri("$nexusBaseUri/repository/public") }
jcenter()
maven { url = uri("http://repo.spring.io/snapshot") }
maven { url = uri("http://repo.spring.io/milestone") }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBoot_version")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
}
}
plugins {
application
// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// the following line causes a problem
// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
kotlin("jvm", kotlin_version)
}
apply {
plugin("kotlin-spring")
plugin("org.springframework.boot")
plugin("io.spring.dependency-management")
}
application {
mainClassName = "eqip.fid.FdmlInterpreterDeveloperAppKt"
}
repositories {
maven { url = uri("$nexusBaseUri/content/groups/public") }
jcenter()
maven { url = uri("http://repo.spring.io/snapshot") }
maven { url = uri("http://repo.spring.io/milestone") }
}
dependencies {
compile(kotlin("stdlib"))
compile("org.springframework.boot:spring-boot-starter-web")
}
tasks {
"wrapper"(Wrapper::class) {
gradleVersion = gradle_version
}
}
Я получаю ошибку в IntelliJ IDEA:
val kotlin_version: String не может быть вызван в этом контексте неявным получателем. Используйте явный при необходимости
Как это исправить?
2 ответа
Вы можете определить версию внутри plugins
а затем сделать эту версию доступной за пределами блога, например, в dependencies
раздел.
plugins {
kotlin("jvm").version("1.1.61")
}
//This is necessary to make the version accessible in other places
val kotlinVersion: String? by extra {
buildscript.configurations["classpath"]
.resolvedConfiguration.firstLevelModuleDependencies
.find { it.moduleName == "kotlin-gradle-plugin" }?.moduleVersion
}
dependencies {
compile(kotlin("stdlib", kotlinVersion))
}
для версии 1.2+ вам придется заменить на kotlin-gradle-plugin
org.jetbrains.kotlin.jvm.gradle.plugin
Я проводил несколько тестов для определения свойств внутри и вне блока buildscript проекта, и, похоже, это не работает. Рабочее и рекомендуемое решение, если вы хотите иметь доступ к свойствам, связанным с зависимостями, - это определение модуля buildSrc (проверьте это репозиторий github), а затем добавление файла / класса Kotlin с желаемыми свойствами (версии, строки...). Что-то типа:
object Dependency {
object Foundation {
const val KOTLIN = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Version.Global.KOTLIN}"
const val RANDOM_VERSION = "1.2.3"
}
У вас может быть доступ ко всему, что объявлено в вашем модуле buildSrc, потому что компоненты, объявленные в нем, разрешаются на этапе инициализации, если я не ошибаюсь. Пример использования:
plugins {
val kotlin = Dependency.Foundation.KOTLIN
kotlin("kapt").version(Dependency.Foundation.RANDOM_VERSION)
}
Больше информации здесь.
UPD не работает, извините за путаницу.
Оригинальный ответ:
-
Другой обходной путь заключается в использовании const val
константы времени компиляции:
object Defs {
const val kotlinVersion = "1.2.60"
}
buildscript {
val kotlinVersion:String by extra { Defs.kotlinVersion }
}
plugins {
kotlin("jvm") version Defs.kotlinVersion
}