Gradle is an amazing build tool. I've been using it for a long time already. Ever since I've contributed back in 2009, Gradle has become my Swiss army knife for automating just about everything.

Gradle has become my Swiss army knife for automating just about everything.

Today I learned something new with an unexpected nice side effect.

Context

When you create a Gradle plugin but don't release it to the Gradle plugin portal. You can't apply it using the plugin { id("my.private.plugin") } syntax.

This is regretable since it has the downside that plugin extensions can't be configured by their name. But with the more verbose configure<ExtensionType>{ ... } syntax, which also add an additional import.

But today I stumbled upon the plugin management section of the Gradle docs. From this I learned that you can tweak plugin resolution for the better.

The new insight

In your settings.gradle.kts file you can add a pluginManagement section and define a resolutionStrategy to specify what dependency to use for a given plugin id.

pluginManagement {
    resolutionStrategy {
        eachPlugin {
            if (requested.id.id == "my.private.plugin") {
                useModule("my.private:plugin:1.0.0")
            }
        }
    }
    repositories {
        jcenter()
    }
}

This allows you to use the plugin{ id("...") } syntax for you own private Gradle plugin.

And the nice side effect is that the named extension blocks are available! No need to use the configure<...> work-around.

So instead of this in your build.gradle.kts file

import my.private.plugin.MyPluginExtension

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath("my.private:plugin:1.0.0")
    }
}

apply(plugin="my.private.plugin")

configure<MyPluginExtension> {
    // ...
}

You can have a clean build.gradle.kts file like so.

plugins {
    id("my.private.plugin")
}

myPlugin {
    // ...
}

Allowing you to use your private plugin in the same way as published plugins can. Or you can use it as a stepping stone before publishing your private plugin to the Gradle plugin portal.

Property access

Additionally I've learned that you have access to the property values defined in the gradle.properties file in the settings.gradle.kts file with the following syntax.

val someProperty : String by settings

Never really needed it but now that I'm managing a bunch of repositories for Kuberig with dependencies this makes it easier to push version changes downstream.