Gradle custom plugin: add dependency on extension object

I am trying to write a plugin that adds dependencies project.dependenciesaccording to the information collected in the plugin extension object. But that seems impossible.

Indeed, data from the extension object is available only in a new task or in closure project.afterEvaluate, but dependencies added in these places are ignored.


The following code tries to add the dependency to afterEvaluate, but the dependency is ignored:

apply plugin: MyPlugin

myplugin {
  version '1.0'
}

class MyPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.extensions.create('myplugin', MyPluginExtension)

    project.afterEvaluate {
       def version = project.myplugin.version
       project.dependencies.add("compile", "org.foo:bar:$version") // --> ignored
    }
  }
}

class MyPluginExtension {
  def version
}

In the following code, dependency injection works, but I don't have access to the extension object:

apply plugin: MyPlugin

myplugin {
  version '1.0'
}

class MyPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.extensions.create('myplugin', MyPluginExtension)    

    def version = project.myplugin.version // == null
    project.dependencies.add("compile", "org.foo:bar:$version") // --> fail because $version is null

  }
}

class MyPluginExtension {
  def version
}

Is there a solution?

+16
source share
4 answers

. . , DependencyResolutionListener, , , .

compileDeps = project.getConfigurations().getByName("compile").getDependencies()
project.getGradle().addListener(new DependencyResolutionListener() {
    @Override
    void beforeResolve(ResolvableDependencies resolvableDependencies) {
        compileDeps.add(project.getDependencies().create("org.foo:bar:$version"))
        project.getGradle().removeListener(this)
    }

    @Override
    void afterResolve(ResolvableDependencies resolvableDependencies) {}
})

,

:

, , . gradle (2.6 ) DependencyResolutionListener , .

project.getGradle().addListener(new DependencyResolutionListener() {
    @Override
    void beforeResolve(ResolvableDependencies resolvableDependencies) {
        depsToAdd.each { dep ->
            compileConfig.getDependencies()
                .add(project.getDependencies().create(dep))
        }
    }

    @Override
    void afterResolve(ResolvableDependencies resolvableDependencies) {

    }
})

, , Android Studio IDE.

+13

, DependencyResolutionListener . , , - , . , compile, , - - :

project.configurations.compile.each {
   ...
}

, , compile - , java. , ( ), , .

afterEvaluate, OP. , , compile:

project.afterEvaluate {
    def version = project.myPlugin.version
    project.configurations.myConfig.dependencies.add(
        project.dependencies.add("myConfig", "org.foo:bar:$version")
    )
}

, - - - , .

+3

, , , Java classpath doFirst:

variant.javaCompile.doFirst {
    variant.javaCompile.classpath += project.configurations.myconfiguration
}
+1

:

project.dependencies {
  delegate.compile("com.android.support:appcompat-v7:25.0.1")
}
0

All Articles