Hello All,
we apply a gradle plugin in the ~/.gradle/init.d/ folder
[myplugin.gradle]
allprojects {
project.buildscript {
dependencies {
classpath 'my.plugin:my-plugin:0.0.1'
}
}
afterEvaluate {
println 'applying my-plugin plugin from ~/.gradle/init.d/myplugin.gradle'
project.apply plugin: 'my-plugin'
}
}
Later in the project wich ‘consumes’ the plugin:
// this is an extension created by my plugin:
myExtension {
//...
}
Could not find method myExtension() for arguments [build_653e6o0dmkyz5sbx0h7mlcngf$_run_closure1@4502e702] on root project 'gradle-dummy-plugin-consumer' of type org.gradle.api.Project.
but this closure works in a subproject
We are using gradle version 4.10.3.
We are looking for a soloution without changing the plugin consumer code. Is this possible?
Kind regard Tom
You can find the whole code here:
afterEvaluate
is causing my-plugin
to be applied after a project is configured/evaluated, so that’s why myExtension
cannot be found during the root project’s configuration/evaluation.
The subproject is “working” because after the root project is configured the plugin is applied to it. When the subproject is being configured it does not yet have the plugin/extension applied, but references that cannot be found on the subproject will be searched for up the project hierarchy. So the subproject is actually configuring the root project’s myExtension
.
Remove the afterEvaluate
from your init script.
Hallo Chris,
I’ve already tried this but I got this error:
* Where:
Initialization script '/home/tom/.gradle/init.d/myplugin.gradle' line: 9
* What went wrong:
Plugin with id 'my-plugin' not found.
Whoops, sorry, did some research and refreshed my memory. It is not currently possible to apply external plugins by id from an init script. You can apply them by class. In order to reference the class the jars must be made available to the init script.
initscript {
repositories {
//repo to find my-plugin
}
dependencies {
classpath 'my.plugin:my-plugin:0.0.1'
}
}
allprojects {
apply plugin: org.me.my.Plugin
}
Hi Chris,
thank you for your answer. Actually this works. But MyPlugin has dependencies to other Plugins (which are also applied by id) and lateron these dependencies are not solved and the allprojects.apply: … in the initscript also fails.
