Gradle自定义插件:从扩展对象添加依赖项 [英] Gradle custom plugin : add dependency from extension object

查看:217
本文介绍了Gradle自定义插件:从扩展对象添加依赖项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个插件,根据插件扩展对象中收集的信息将相关性添加到 project.dependencies 中。但它似乎是不可能的。



事实上,来自扩展对象的数据仅适用于新任务或 project.afterEvaluate 闭包,但在这些地方添加的依赖被忽略。




下面的代码尝试在 afterEvaluate 中添加依赖关系,但忽略依赖关系:

  apply plugin:MyPlugin 

myplugin {
version'1.0 '
}

class MyPlugin实现插件< 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)// - >忽略
}
}
}

class MyPluginExtension {
def版本
}






在以下代码中,依赖注入有效,但我无法访问扩展对象: p>

  apply plugin:MyPlugin 

myplugin {
version'1.0'
}

class MyPlugin实现插件< Project> {
void apply(Project project){
project.extensions.create('myplugin',MyPluginExtension)

def version = project.myplugin.version // == null
project.dependencies.add(compile,org.foo:bar:$version)// - >失败,因为$ version为空

}
}

class MyPluginExtension {
def版本
}

是否有解决方案?

解决方案

更新:自从我的原始答案以来,我设法弄清楚了这一点。这样做的方法是添加一个 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)
}
$ b @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工作。在我的问题中跟踪问题此处


I'm trying to write a plugin which adds dependencies to project.dependencies according to informations gathered in the plugin extension object. But it seems to be impossible.

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


The following code tries to add the dependency in 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 the 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 ?

解决方案

Update: I managed to figure this out since my original answer. The way do this is to add a DependencyResolutionListener in which you add the dependencies and then remove the listener so it doesn't try to add them on later resolution steps.

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) {}
})

I have a working example of a plugin that uses this here

Original Answer:

This is also late but for anyone dropping in. With the latest gradle (2.6 at the time of writing), you can add a DependencyResolutionListener and add any dependencies before dependencies are resolved.

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) {

    }
})

However, as of this writing I was having some issues getting this to work with Android Studio IDE. The problem is tracked in my question here

这篇关于Gradle自定义插件:从扩展对象添加依赖项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆