I have a multi-project build, and more often than not I find myself locking versions for artifacts across the board. So in my root project I define something like:
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
}
While I can use pkgVersions
anywhere, including other subprojects:
val pkgVersions by rootProject.extra
jooq {
version = pkgVersions["jooq"]
}
I am not able to do so inside a plugin block:
plugins {
kotlin("jvm") version pkgVersions["kotlin"]
}
Gives me the error "pkgVersions can't be called in this context by implicit receiver. Use the explicit one if required". I am assuming this is because the implicit receiver should probably be the file's JVM impression? But instead it is using PluginDependencySpec
. Trying an auto-complete with this@
shows only this@plugin
. This is just a long-shot guess from me. But, any pointers on what I am supposed to do?
Also, while we are at it, is there a way to create a global type in gradle-kotlin-dsl
, for instance:
data class MyBuildType(..)
and have it available everywhere WITHOUT using buildSrc
? It's pretty straightforward with buildSrc
and I don't mind using it, but just wondering.
Apparently this has become possible recently, if it wasn't possible in the past. (Almost) from the docs:
gradle.properties
:
helloPluginVersion=1.0.0
settings.gradle.kts
:
pluginManagement {
val helloPluginVersion: String by settings
plugins {
id("com.example.hello") version helloPluginVersion
}
}
And now the docs say that build.gradle.kts
should be empty but my testing shows that you still need this in build.gradle.kts
:
plugins {
id("com.example.hello")
}
The version is now determined by settings.gradle.kts
and hence by gradle.properties
which is what we want...