Last active
October 15, 2018 20:28
-
-
Save ksaua/74d75901458235f48da1 to your computer and use it in GitHub Desktop.
Gradle plugin which uses itself
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Let's say we have a gradle plugin. Now we want that gradle plugin project to actually use the exact plugin. | |
// There are probably multiple ways we can bootstrap this. One way is to build the jar, and use that, but that's boring. | |
// Here we show how we can have the plugin-project use the actual plugin we are building. | |
// :: We load the groovy script on runtime, only then are we able to apply the plugin | |
// Setup the groovy classpath. Start with our own files | |
def classpaths = [file('src/main/groovy').absolutePath, file('src/main/resources').absolutePath] | |
// The groovy script engine wants a string array | |
String[] classpathArray = classpaths.toArray(new String[classpaths.size()]); | |
// Start a groovy script engine with our classpaths | |
def engine = new GroovyScriptEngine(classpathArray, this.getClass().getClassLoader()) | |
// Now we can load the plugin script | |
def pluginClass = engine.loadScriptByName('org/example/MyPlugin.groovy') | |
apply plugin: pluginClass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MyPlugin implements Plugin<Project> { | |
@Override | |
void apply(Project project) { | |
// Here you do whatever you normally want in your plugin | |
} | |
} | |
Pretty awesome - just modified unofficial bintray plugin to publish itself! https://github.com/ysb33r/bintray
Awesome. I have spend hours figuring out how to do this. My use case is for testing the plugins i write. Thanks for sharing.
<3
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The use case is simple: When the plugin uses itself.
At work we have a plugin which sets up a bunch of default configuration.
For example:
The plugin which houses these configurations is itself a gradle project, so it should also use the same default configuration.
Say I update the checkstyle configuration to be a bit more strict and that I in the same commit I actually violated the new checkstyle configuration.
If I depend on a jar file it will use an old version of the checkstyle configuration and thus it will not fail the build until I depend on the a new jar.
If I use the approach specified above it will fail the build immediately!