2017-03-02 7 views
0

コードワには多くのプラグインがあり、その多くはGoogle Playサービスを使用しています。そして、各プラグインはいくつかの特別なバージョンのプレイサービスを使いたいと思っています。それは本当に面倒です。Gradle。コンパイル(x.x.x)とパッケージ化(y.y.y)の解決版は異なる

この問題を解決するために、私はgraddleで単純な依存関係のバージョンリゾルバを作成しようとしています。それはいくつかのプラグインの依存関係(私はサービスのバージョンを再生することを意味する)から必要なバージョンを取得し、他のプラグインの依存関係と同じバージョンを設定する必要があります。

は、ここに私のスクリプトです:

def right_version = "9+"; 
configurations.all{ 
    resolutionStrategy{ 
     eachDependency { DependencyResolveDetails details -> 
      if (details.requested.name.contains('play-services') && details.requested.version != '9+') { 
       right_version = details.requested.version 
      } 
     } 
     eachDependency { DependencyResolveDetails details -> 
      if (details.requested.name.contains('play-services')){ 
       details.useVersion right_version 
      } 
     } 
    } 
} 

それは正常に動作しますが、少し問題があります。次のようなエラーが表示されました。

Conflict with dependency 'com.google.android.gms:play-services-ads'. Resolved versions for compilation (10.2.0) and packaging (9.8.0) differ. This can generate runtime errors due to mismatched resources. 

何故ですか?あるいは、あなたは依存関係の競合を解決する良い方法を知っていますか?

答えて

0

最後に、私は問題の原因を発見しました。 eachDependencyを2回使用し、2回目の使用時にバージョンを変更することは悪い考えです。表示されるように、最初のeachDependencyの後に依存関係が承認されます(またはそのようなもの)。だから、次のコードですべての作業罰金:

def right_version = "9+"; 
configurations.all{ 
    dependencies.all{ Dependency d -> 
     def right_version_copy = right_version 
     if(d.getName().contains("play-services") && d.getVersion() != right_version_copy){ 
      right_version = d.getVersion() 
     } 
    } 
    resolutionStrategy{ 
     eachDependency { DependencyResolveDetails details -> 
      if (details.requested.name.contains('play-services')){ 
       details.useVersion right_version 
      } 
     } 
    } 
} 
0

開発のためにこのIDEを使用している場合は、Androidスタジオでオフラインでないことを確認してください。ファイル>設定>ビルド、実行、展開> Gradleという名前で確認できます。あなたは、コマンドラインツールやAndroidのスタジオを使用している場合は 第二には、Googleがそのような コンパイル「com.google.android.gmsとしてアプリケーションやアプリbuild.gradleに最新バージョンにサービスを果たし更新する必要があります:play-services-location:9.2.0 ' to latest as ' com.google.android.gms:play-services-location:10.2.0 'をコンパイルします。 あなたはここのリストから完全なgoogle playサービスパッケージの代わりにプレイサービスapiの特定のバージョンを選択することができます[https://developers.google.com/android/guides/setup][1]

+0

ポイントは、何人かの人々が(プレイサービスの最後ではないバージョンで)いくつかの他のコルドバのプラグインで(Googleがサービスを再生使用)私のコルドバのプラグインを使用することができるということです。だから、私はすべてのプラグインで再生サービスのバージョンを更新することでその問題を解決することはできません。 そして私はこのスクリプトのためにアンドロイドスタジオを使用しません。私はcordova CLIを介してプロセスを構築する。 – Tamplier

+0

** Gradle IntelliJ **は最新バージョンのcordovaのプラグインで使用されているモジュール/ライブラリでGoogleサービスのバージョンを注文できるラッパーとして機能します。Android/cordovaアプリケーションのアプリケーションモジュールは最新バージョンのプレイに更新することを強くお勧めしますライブラリ/モジュールの古いバージョンのサポート、アプリケーションのアプリケーションモジュールの新しいバージョンのサポートは、Gradle自身によって自動的に管理されます。 – taranjeetsapra

+0

最後のバージョンを使用することが最善の解決策であるかどうかはわかりません。 APIのいくつかの変更によりプラグインが削除される可能性があるため、テストされたメジャーバージョンのライブラリを使用することをお勧めします。 とにかく、それは良いアイデアでも、現実世界では機能しません。私は古いプレイサービスを持つプラグインを知っています(実際に私のユーザーは、異なるバージョンの問題について私に書きます)。 – Tamplier

関連する問題