26

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
}

次のコードでは、依存性注入が機能しますが、拡張オブジェクトにアクセスできません:

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
}

解決策はありますか?

4

4 に答える 4

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

これを使用するプラグインの実例がありますhere

元の回答:

これも遅いですが、どなたでもご参加いただけます。最新の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 で動作させるにはいくつかの問題がありました。問題はここの私の質問で追跡されています

于 2015-09-14T18:07:08.147 に答える
4

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

もちろん、ある時点で依存関係を実際に解決するには、依存関係を反復処理する必要があります。

于 2016-04-02T00:05:06.500 に答える
1

それがまだ関連しているかどうかはわかりませんが、コンパイル構成を doFirst の Java クラスパスに明示的に追加することで、これを回避できます。

variant.javaCompile.doFirst {
    variant.javaCompile.classpath += project.configurations.myconfiguration
}
于 2014-01-11T23:45:49.983 に答える