Как добавить переменные 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' не может быть вызван в этом контексте неявным получателем. При необходимости используйте явный

Как это исправить?


person Andy    schedule 05.09.2017    source источник
comment
Вы не можете использовать переменные в этом разделе. Этот вопрос уже был задан в stackoverflow с ответом, просто хотел поставить ответ здесь на случай, если кто-то еще столкнется с ним. stackoverflow.com/a/37749402/559536   -  person Alex    schedule 23.10.2017
comment
stackoverflow.com/a/53594357/3557894   -  person nimelorm    schedule 03.12.2018


Ответы (3)


Вы можете определить версию внутри 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

person s1m0nw1    schedule 27.11.2017
comment
выглядит отлично, но возвращает null для меня: / - person Xerus; 23.01.2018
comment
@Xerus какую версию вы используете? - person s1m0nw1; 23.01.2018
comment
1.2.20, самая последняя версия. ModuleName теперь кажется org.jetbrains.kotlin.jvm.gradle.plugin - когда я использую его, он снова работает - person Xerus; 23.01.2018

Я проводил несколько тестов по определению свойств внутри и вне блока 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)
}

Дополнительная информация здесь.

person cesards    schedule 20.04.2020

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
}
person aimozg    schedule 07.08.2018
comment
Это приводит к ошибке Gradle: Ошибка компиляции скрипта: Строка 10: val kotlinVersion: String by extra {Defs.kotlinVersion} ^ Неразрешенная ссылка: Defs 1 error - person Pierre-Yves Saumont; 16.09.2018