Gradleでtransitive = trueは正確に何をしますか(wrttlytics)


174

Gradle transitive = trueは正確に何をしますか?Gradleのドキュメントからは明らかではありません。これは、のコンテキストにあるcompilebuild.gradle。私の場合、私はAndroidのcrashlyticsに依存しています。

compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
    transitive = true;
}

いくつかのGradleドキュメント(hereおよびhere)は、「推移的」のデフォルトがtrueであることを示唆しています。それでも削除するとtransitive = true、推移的な依存関係がもたらされません(特にKitGroup)。

class file for io.fabric.sdk.android.KitGroup not found

ドキュメントによると、デフォルトはtrueですが、実際の動作は反対のようです。

Gradle 2.2.1を実行しています。おそらく、動作は2.2と2.4の間で変更されましたか?

編集Gradleを使用してaarライブラリの関連する推移的な依存関係が解決されない


構成を定義するとき、または依存関係を定義するとき?
ドナウ2015

jarファイルの依存関係はサブプロジェクトに昇格します。すべてのプロジェクトで依存関係を明示的に定義する必要はありません。
Konrad

このドキュメントで正確に明確でないものは何ですか?
Oleg Estekhin 2015

3
@OlegEstekhinドキュメントは、私が見ている実行時の動作と一致しません
Steve Kuo

回答:


153

@aar表記を使用しています。
これは、aarアーティファクトのみをダウンロードし、依存関係は不要であることを意味します。ドキュメントの
この部分を確認できます:セクションを
確認してください1.4.1.2. Artifact only notation

アーティファクトのみの表記は、指定された拡張子を持つアーティファクトファイルのみをダウンロードするモジュール依存関係を作成します。既存のモジュール記述子は無視されます。

@aar依存関係をダウンロードする場合は、表記を使用して、を追加する必要がありtransitive=trueます。

@aarを省略しても、推移的な属性を追加せずに機能するはずです。


7
@aarを省略して推移的な属性を削除することで動作することを確認しました。ここでの意図は、開発者がFabricキットを明示的に参照すること(たとえば、「com'crashlytics.sdk.android:crashlytics:2.5.5」をコンパイルすること)、およびコアio.fabric.sdk.androidクラスは、推移依存。Transitive = falseを設定した場合、io.fabric.sdk.android.Fabricクラスはコンパイル時に見つかりません。
マークマクレランド

7
この「機能」はとても悪いので、依存関係のあるaarが欲しい。@aarがなければ、jarを検索して文句を言う
dowi

12

より一般的な注意:ライブラリを設定transitive = falseすると、crashlyticsgradleはcrashlytics(= "transient libraries")に必要なすべてのライブラリを無視し、それらをダウンロードしてリンクしなくなります。

必要なライブラリを手動でプロジェクトに追加するか、他の依存関係によって追加された他の一時ライブラリに依存する必要があります。

Gradleのデフォルトはtransitive = trueです。

ここに例と完全な説明:http : //www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/


リンクが機能しない。場合によっては特にtrueと書いてあるため、デフォルトではtrueになっていないと思います
Morozov

@Morozovリンクが修正されました。GOTCHAをありがとう!
Vaiden、

5

私の推測では、手動で参照しているCrashlyticsアーティファクトは依存関係を推移的でないtransitive=false)として指定しているため、デフォルトでそれらの依存関係を強制的に取り込む必要はありません。そのため、反対の動作が見られます。たとえば、一部の開発者は、Google Play開発者サービスのすべて、またはCrashlyticsが使用している場合に使用する可能性のあるものすべてをプルしたくない場合があります。

したがって、それを削除すると、Gradleは依存関係を取り込めなくなり、ビルドに失敗します。必要に応じて、その依存関係を手動で指定できます。

言われていること -私が直面しているより大きな問題は、Crashlyticsアーティファクトを直接参照するべきではないことだと思います。Fabricを使用し、結果としてCrashlyticsを取り込む必要があります。https//dev.twitter.com/fabric/ android / integrating


ファブリックへの移行手順では、Crashlyticsアーティファクトを直接参照することを指定し、そのファブリック「キット」を使用していると想定しています。fabric.io
Mark McClelland

キットを直接参照し、推移的な依存関係を介してio.fabric.sdk.androidクラスを取得することが意図されているようです。
マークマクレランド

1

この依存関係を、その推移的な依存関係を含めて、または除外して解決する必要があるかどうかを設定します。この依存関係に属する成果物は、他の成果物への依存関係を持つ可能性があります。後者は、推移的な依存関係と呼ばれます。


1

Gradleはデフォルトで推移的な依存関係に従います。特定のライブラリでこれをオフにする場合は、推移的フラグを使用します。

推移フラグの値をfalseに変更すると、推移依存関係のダウンロードが防止されるため、必要なものを自分で追加する必要があります。追加の依存関係なしでモジュールjarのみが必要な場合は、それも指定できます。


2
これは非常に賛成された回答のアドバイスを超えてどのような価値をもたらしましたか?
hrbrmstr 2016年

-19

transitive推移性を制御します。Gradleは通常、推移的でない場合を除いて、デフォルトで推移的です。推移性と分類子にバグがあります。https://issues.gradle.org/browse/GRADLE-3188を参照してください


39
バグを指摘されたのは当然だと思います。ただし、プロパティの説明は役に立ちません。「推移性は推移性を制御します。Gradleは通常、推移性をデフォルトにします(そうでない場合を除く)。」ほんとに?
w3bshark

4
@ w3bsharkおもしろいと思った。「デフォルトでは推移的ですが、そうでない場合を除きます」は、私の経験ではかなり正確です。
Navin

4
@ w3bshark私は投票についてあまり気にすることができませんでした。学んだことをコミュニティと共有しています。
Steve Kuo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.