Kiran Mohan
Kiran Mohan

Reputation: 2996

Specify kotlin version in buildSrc kotlin convention plugin

I am developing a Kotlin project with multiple subprojects as explained here
Building Kotlin Applications with libraries Sample (gradle.org)

Is it correct to specify the kotlin version as as shown below?
file: buildSrc/build.gradle.kts

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:<kotlin-version>")
}

Also, is it possible to move this kotlin version to a central location for declaring project-wide dependency version (for example gradle.properties or buildSrc/**/Dependencies.kt or versions catalog)? None of the approaches mentioned seems to be supported in buildSrc/build.gradle.kts.

Upvotes: 7

Views: 2821

Answers (3)

Kiran Mohan
Kiran Mohan

Reputation: 2996

There are many approaches to specify the kotlin version (or versions of any dependency) at a centralized location in a Gradle Multimodule Project.

However, if you are defining a Kotlin Convention Plugin in buildSrc, the kotlin version is not available in buildSrc/build.gradle.kts using any of the methods mentioned above so as to pick the right kotlin-gradle-plugin.

For a workaround solution, use the following.

# file:<root>/gradle.properties

kotlinVersion=1.5.31
// file:<root>/buildSrc/build.gradle.kts

import java.io.*
import java.util.*

// read gradle.properties programmatically
val props = Properties()
FileInputStream(file("../gradle.properties")).use {
    props.load(it)
}

plugins {
    `kotlin-dsl`
}

repositories {
    gradlePluginPortal()
}

dependencies {
    val kotlinVersion = props.getProperty("kotlinVersion")
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
}

In all other <root>/**/<subproject>/build.gradle.kts files access the kotlinVersion like

val kotlinVersion = project.properties["kotlinVersion"]

In settings.gradle.kts, access the kotlinVersion like

val kotlinVersion:String by settings

If anyone from the Gradle team reading this, please provide an API to access gradle.properties consistently across any of the build script files.

Upvotes: 4

dkb
dkb

Reputation: 4566

I have solved this issue by specifying kotlinVersion in gradle.properties file as below.

kotlinVersion=1.6.10

Keep gradle.properties file at outermost project level.

You can access kotlinVersion in any submodules and project as

//top level declaration
val kotlinVersion by extra(project.property("kotlinVersion"))
//usage in dependency block
"org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}"

To verify whether you are able to read it, you can specify following

println(project.property("kotlinVersion"))

This should print kotlin version as

> Configure project :
1.6.10

build.gradle.kts file

val kotlinVersion by extra(project.property("kotlinVersion"))
println("${kotlinVersion}")

group = "com.company"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenCentral()
    mavenLocal()
    maven { url = uri("https://repo.spring.io/milestone") }
    maven { url = uri("https://repo.spring.io/snapshot") }
    gradlePluginPortal()
}

dependencies {

    implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
}

gradle.properties file

kotlin.code.style=official
#kotlin.parallel.tasks.in.project=true
#kapt.incremental.apt=true

org.gradle.parallel=true
org.gradle.caching=false
org.gradle.daemon=true
org.gradle.jvmargs=-Dfile.encoding=UTF-8

kotlinVersion=1.6.10

Ref:

Upvotes: 0

Yash Shah
Yash Shah

Reputation: 60

in app gradle implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" and project gradle ext.kotlin_version = "1.6.0"

Upvotes: 0

Related Questions