Apa tepatnya yang transitive = true
dilakukan Gradle ? Tidak jelas dari dokumentasi Gradle . Ini dalam konteks di compile
dalam build.gradle
. Dalam kasus saya, saya bergantung pada crashlytics Android.
compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
transitive = true;
}
Beberapa dokumen Gradle (di sini dan di sini ) menyiratkan bahwa "transitif" default menjadi true. Namun menghilangkan transitive = true
hasil dalam dependensi transitif tidak dibawa (khususnya KitGroup
).
class file for io.fabric.sdk.android.KitGroup not found
Dokumen mengatakan standarnya benar, namun perilaku yang sebenarnya tampaknya sebaliknya.
Saya menjalankan Gradle 2.2.1. Mungkin perilaku berubah antara 2,2 dan 2,4?
Sunting : Ketergantungan transitif terkait tidak diselesaikan untuk perpustakaan aar menggunakan gradle
java
android
gradle
build.gradle
crashlytics
Steve Kuo
sumber
sumber
Jawaban:
Anda menggunakan
@aar
notasi.Ini berarti bahwa Anda ingin mengunduh hanya artefak aar, dan tidak ada ketergantungan.
Anda dapat memeriksa bagian dokumentasi ini :
Periksa
1.4.1.2. Artifact only notation
bagian ini:Menggunakan
@aar
notasi jika Anda ingin mengunduh dependensi, Anda harus menambahkantransitive=true
.Saya berharap bahwa menghilangkan @ aar seharusnya berfungsi tanpa menambahkan atribut transitif.
sumber
Pada catatan yang lebih umum: Pengaturan
transitive = false
padacrashlytics
perpustakaan menyebabkan gradle mengabaikan semua perpustakaan yang diperlukan olehcrashlytics
(= "perpustakaan sementara") dan tidak mengunduh dan menautkannya.Anda harus menambahkan pustaka yang diperlukan secara manual ke proyek Anda atau mengandalkan pustaka sementara lainnya yang ditambahkan oleh dependensi lain.
Default untuk gradle adalah
transitive = true
.Contoh dan penjelasan lengkap di sini: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/
sumber
Dugaan saya adalah bahwa artefak Crashlytics yang Anda referensikan secara manual menetapkan dependensi sebagai tidak transitif (
transitive=false
) sehingga Anda tidak dipaksa untuk membawa dependensi tersebut secara default. Itu sebabnya Anda melihat perilaku yang berlawanan. Misalnya beberapa pengembang mungkin tidak ingin menarik semua Layanan Google Play atau apa pun yang Crashlytics dapat gunakan jika ada.Jadi, dengan menghapus itu, Gradle tidak lagi menarik ketergantungan, dan gagal membangun. Anda dapat menentukan ketergantungan itu secara manual jika perlu.
Yang sedang berkata - Saya pikir masalah yang lebih besar adalah bahwa Anda tidak harus merujuk artefak Crashlytics secara langsung - Anda harus menggunakan Fabric, dan menarik Crashlytics sebagai hasilnya: https://dev.twitter.com/fabric/ android / mengintegrasikan
sumber
Menetapkan apakah ketergantungan ini harus diselesaikan termasuk atau tidak termasuk dependensi transitifnya. Artefak yang termasuk dalam dependensi ini mungkin memiliki ketergantungan pada artefak lain. Yang terakhir disebut dependensi transitif.
sumber
Gradle mengikuti dependensi transitif secara default. Jika Anda ingin mematikannya untuk perpustakaan tertentu, gunakan bendera transitif.
Mengubah nilai bendera transitif ke false mencegah pengunduhan dependensi transitif, jadi Anda harus menambahkan sendiri apa pun yang diperlukan. Jika Anda hanya menginginkan tabung modul, tanpa ada ketergantungan tambahan, Anda dapat menentukannya juga.
sumber
transitive
mengontrol transitivitas. Gradle biasanya default ke transitif, kecuali jika tidak. Ada bug dengan transitivity dan classifier, lihat https://issues.gradle.org/browse/GRADLE-3188 .sumber