2016-11-10 13 views
1

私はデスクトップ用に構築するのかAndroid用に作るのかに基づいて、私のマルチプロジェクトビルドでさまざまな依存関係を選択するようにしています。私は再利用しようとしている共通のサブプロジェクト(ライブラリ)を持っています。しかし、Gradleに依存関係の設定を正しく切り替えることはできません。プラットフォームに応じてGradleの依存関係を切り替える

私の主なsettings.gradle単純にすべての依存関係が含まれています

// /settings.gradle 
rootProject.name = 'myProject' 

include 'androidUI' 
include 'reusableLibrary' 
include 'desktopUI' 

androidUIdesktopUI両方が依存関係としてreusableLibraryを指定:

// /androidUI/build.gradle and /desktopUI/build.gradle 
apply plugin: 'java' 
dependencies { 
    compile project(path: ':reusableLibrary', configuration: 'desktop') 
} 

reusableLibraryその依存関係がいるかどうか異なっているので、それ自体は、二つの構成を指定しますデスクトップまたはAndroid上に構築されています:

// /reusableLibrary/build.gradle 
apply plugin: 'java' 
configurations { 
    desktop { 
     extendsFrom compile 
    } 
    android { 
     extendsFrom compile 
    } 
} 

dependencies { 
    // Just examples, the real list is longer. 
    // The point is that h2database is only included on desktop, 
    // and ormlite is only included on Android. 
    android 'com.j256.ormlite:ormlite-jdbc:5.0' 
    desktop 'com.h2database:h2:1.4.192' 
} 

このは、と思われます。私はdesktopUI又はandroidUIのいずれかをコンパイルするときには、私は、依存性reusableLibraryもののはreusableLibrary自体によって提供される実際のJAR 含まないが、私が望むようにクラスパスに含まれていることがわかります。これによりビルドが失敗します。私はreusableLibraryを正しく設定していないと思う。私はconfigurations {}ブロックが何をするのかはっきりしていません。

reusableLibraryのコンパイルされた項目がUIプロジェクトのクラスパスに含まれないのはなぜですか?そして、プラットフォーム固有の依存関係をこのように組み込む標準的な方法は何ですか?

答えて

1

オリジナルの設定はかなり近いです。キーがGradle Java plugin's documentationからこの依存関係グラフを理解することです:

Java dependency configurations

これは、ためのGradle-ESEであるJavaプラグインの様々な依存構成の可視化である「依存関係のリスト。」 dependencies {...}ブロックにcompile行を追加すると、compile依存リストにDependency要素が追加されます。

default依存関係の設定は特別です。 configuration:引数で別のものが選択されない限り、compile project("path")行に含まれるものです。つまり、ライブラリをビルドすると、クライアントプロジェクトのクラスパスにruntime依存リスト(にはライブラリ自体のコンパイル済みのjarが含まれています)が追加されます(つまり、)。

元の構成は、extendsFromを使用して、2つの新しいノード、このグラフでdesktopandroid、及びcompileに結合するそれらの両方を作成します。彼らはグラフに接続されていません!現在、元の設定の問題は明らかです。アップストリームプロジェクトをこれらのいずれかに切り替えると、であり、runtimeのコードがありません。これはクラスパスの省略を説明しています。

解決策は、ちょうどdesktopandroidruntimeにすることより少し微妙です。テストを追加するときにすべてが正しく分離されるように、testCompileruntimeに応じて間接的に保持されるように、1つの追加の依存関係のレイヤーが必要です。さらに、ライブラリのソースコード自体は型チェックするためにクラスパス上に物事を必要とするかもしれません。これにはcompileOnlyを使用できます。最終的なソリューションは次のようになります。

configurations { 
    desktopCompile 
    androidCompile 

    compileOnly.extendsFrom desktopCompile 
    testCompile.extendsFrom desktopCompile // Assuming tests run on the desktop 

    desktop { 
     extendsFrom desktopCompile 
     extendsFrom runtime 
    } 
    android { 
     extendsFrom androidCompile 
     extendsFrom runtime 
    } 
} 

dependencies { 
    androidCompile "some.android:dependency" 
    desktopCompile "other.desktop:dependency" 
} 
関連する問題