Search code examples
gradle-kotlin-dsl

Can't use project extra properties in plugin block


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.


Solution

  • 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...