Gradle自定义插件:从扩展对象添加依赖项

tbr*_*lle 22 gradle

我正在尝试编写一个插件,project.dependencies根据插件扩展对象中收集的信息添加依赖项.但这似乎是不可能的.

实际上,来自扩展对象的数据仅在新任务或project.afterEvaluate闭包中可用,但忽略在这些位置添加的依赖项.


以下代码尝试添加依赖项,afterEvaluate但忽略依赖项:

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
}
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

有解决方案吗?

Saa*_*ooq 19

更新:自从我的原始答案以来,我设法解决了这个问题.这样做的方法是添加一个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) {}
})
Run Code Online (Sandbox Code Playgroud)

我有一个插件的工作示例,在这里使用它

原答案:

这也是迟到的,但对于任何人来说都是如此.使用最新的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) {

    }
})
Run Code Online (Sandbox Code Playgroud)

但是,在撰写本文时,我遇到了一些与Android Studio IDE兼容的问题.我的问题在这里跟踪了这个问题


Viv*_*ath 5

我最初使用DependencyResolutionListenerSaad 的方法实现了这个解决方案。但是,仅当某些内容迭代与 dependency 关联的配置时,才会调用侦听器本身。例如,如果您想动态添加依赖项compile,则必须确保稍后执行以下操作:

project.configurations.compile.each {
   ...
}
Run Code Online (Sandbox Code Playgroud)

但这是理所当然的事情,因为这compile是使用 java 插件的任何项目的已知配置。但是,如果您使用自定义配置(就像我一样),那么侦听器方法将不起作用,除非您显式迭代自定义配置。

我能够找到一种更好的方法来做到这一点,并且按照afterEvaluateOP最初想要的那样。我在这里使用自定义配置,但我没有看到它不起作用的原因compile

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

当然,在某些时候仍然需要迭代依赖项才能真正解决它们。


Evi*_*uck 1

不知道这是否仍然相关,但您可以通过将编译配置显式添加到 doFirst 中的 Java 类路径来解决此问题:

variant.javaCompile.doFirst {
    variant.javaCompile.classpath += project.configurations.myconfiguration
}
Run Code Online (Sandbox Code Playgroud)