3

私のビルドには、Android アプリと Java ライブラリの 2 つのモジュールがあります。(余談ですが、Java ライブラリは Android アプリのクラスに対して jvm テストを実行するためのものです。Gradle Java プラグインが必要であり、Gradle Android プラグインと互換性がないため、それらを分割する必要がありました。)

Java モジュールでは、他のモジュールのすべての依存関係を自動的にインポートして、同期を維持する必要がないようにします。

compileTestあるモジュールの依存関係を別のモジュールの依存関係と一致するように構成するにはどうすればよいですcompileか?

(両方のプラグインを使用するための別の提案を歓迎します。)

4

1 に答える 1

3

次のように記述すると、module1のcompile依存関係が module2 の依存関係として取得されtestCompileます。

dependencies { 
    testCompile project(':module1') 
}

module2のbuild.gradleファイル内。ご自身のコメントで述べたように、module2 に適用されていない場合、module1 に適用された Android プラグインから依存関係を取得することはできません。

編集:別のスクリプトで依存関係を定義する方法について、次の説明を追加しました。

コメントで述べたように、代替手段は、すべてのサードパーティの依存関係を定義する別のスクリプトにプロパティを追加することです。私は、関与しているすべてのマルチ プロジェクト ビルドでこれを行う傾向があります。実際、私はdependencies.gradleファイルの存在に慣れているので、実際には単一プロジェクト ビルドでもこれを行います。

アイデアは非常に単純です。

  • サードパーティの依存関係を定義するプロパティを持つ別のスクリプトを追加します
  • このスクリプトをすべてのモジュールに適用します
  • どこでも重複するハードコーディングの代わりにプロパティを使用する

そうすれば、すべての依存関係を 1 か所で定義でき、依存関係の定義の読みやすさが向上し、モジュールが互いに「非同期」になることはありません (たとえば、同じライブラリの異なるバージョンに依存する 2 つのモジュール)。追加のボーナスは、1 つのプロパティに属する複数の依存関係を組み合わせることができることです。

例:

質問で説明されているように、2 つのモジュールがあるとします。モジュール 1 では、いくつかのサードパーティ ライブラリを使用します。モジュール 2 は、モジュール 1 をテストすることになっており、モジュール 1 で定義されているすべてのライブラリと、独自のライブラリが必要です。

dependencies.gradle

ext {
    JAVAX_MAIL = 'javax.mail:mail:1.4.5'
    JODA_TIME = 'joda-time:joda-time:2.1'
    LOG4J = 'log4j:log4j:1.2.16'
    SPOCK = [
            'org.spockframework:spock-core:0.7-groovy-2.0',
            'org.objenesis:objenesis:1.2',
            'cglib:cglib-nodep:2.2.2'
    ]

    // Note: I don't usually combine dep's like this, it's just for illustration.
    //       I prefer to spell them out to make it more explicit.
    MODULE_1_DEPS = [ JAVAX_MAIL, LOG4J ]
}

module1/build.gradle

apply from: "$rootDir/dependencies.gradle"

dependencies {
    compile MODULE_1_DEPS
}

module2/build.gradle

apply from: "$rootDir/dependencies.gradle"

dependencies {
    compile JODA_TIME, LOG4J
    testCompile MODULE_1_DEPS, SPOCK
}

注: プロパティをリストのリストに「結合」する場合、リストをフラット化する必要がある場合があります。つまり、次のようなものですMY_DEP = [ DEP1, DEP2 ].flatten()おそらくgradleがあなたのためにそれを行いますが、正直なところわかりません-私はそれをテストしていません。

また、注意: ここでの例は、目的を達成する方法を示したものであり、決して完全ではありません。

于 2013-10-16T13:38:37.790 に答える