Apa yang sebenarnya dilakukan oleh transitive = true dalam Gradle (wrt crashlytics)?

174

Apa tepatnya yang transitive = truedilakukan Gradle ? Tidak jelas dari dokumentasi Gradle . Ini dalam konteks di compiledalam 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 = truehasil 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

Steve Kuo
sumber
ketika mendefinisikan konfigurasi, atau ketika mendefinisikan dependensi?
Dnault
Ketergantungan file jar dipromosikan ke sub proyek. Tidak setiap proyek perlu mendefinisikan dependensinya secara eksplisit.
Konrad
Apa sebenarnya yang tidak jelas dalam dokumentasi ini ?
Oleg Estekhin
3
@OlegEstekhin dokumentasi tidak cocok dengan perilaku runtime yang saya lihat
Steve Kuo

Jawaban:

153

Anda menggunakan @aarnotasi.
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 notationbagian ini:

Notasi artefak saja menciptakan ketergantungan modul yang hanya mengunduh file artefak dengan ekstensi yang ditentukan. Deskriptor modul yang ada diabaikan .

Menggunakan @aarnotasi jika Anda ingin mengunduh dependensi, Anda harus menambahkan transitive=true.

Saya berharap bahwa menghilangkan @ aar seharusnya berfungsi tanpa menambahkan atribut transitif.

Gabriele Mariotti
sumber
7
Saya mengkonfirmasi bahwa menghilangkan @ aar dan menghapus karya atribut transitif. Tujuannya di sini adalah bahwa pengembang mereferensikan kit Kain secara eksplisit (misalnya, "kompilasi 'com.crashlytics.sdk.android:crashlytics :.5.5'"), dan agar kelas inti io.fabric.sdk.android ditarik melalui ketergantungan transitif. Jika Anda mengatur transitive = false, maka kelas io.fabric.sdk.android.Fabric tidak akan ditemukan pada waktu kompilasi.
Mark McClelland
7
"fitur" ini sangat buruk, saya ingin aar dengan dependensinya. tanpa @ aar itu mencari toples dan mengeluh
dowi
12

Pada catatan yang lebih umum: Pengaturan transitive = falsepada crashlyticsperpustakaan menyebabkan gradle mengabaikan semua perpustakaan yang diperlukan oleh crashlytics(= "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/

Vaiden
sumber
tautan tidak berfungsi. Saya khawatir itu tidak benar secara default, karena dalam beberapa kasus secara khusus menulis benar
Morozov
Tautan @Morozov diperbaiki. Terima kasih untuk GOTCHA!
Vaiden
5

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

Sam Dozor
sumber
Petunjuk untuk bermigrasi ke Fabric menentukan referensi artefak Crashlytics secara langsung, dengan anggapan Anda menggunakan "kit" Fabric tersebut: fabric.io/migrations/gradle
Mark McClelland
Sepertinya maksudnya adalah bahwa Anda merujuk kit secara langsung, dan mereka menarik kelas io.fabric.sdk.android melalui ketergantungan transitif.
Mark McClelland
1

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.

pengguna6703435
sumber
1

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.

Hongyuan
sumber
2
Nilai apa yang ditambahkan ini di luar saran dalam jawaban yang sangat tervvatifikasi?
hrbrmstr
-19

transitivemengontrol transitivitas. Gradle biasanya default ke transitif, kecuali jika tidak. Ada bug dengan transitivity dan classifier, lihat https://issues.gradle.org/browse/GRADLE-3188 .

Steve Kuo
sumber
39
Saya pikir itu adil bahwa Anda menunjukkan bug. Tetapi, deskripsi properti Anda tidak membantu. "Transitif mengontrol transitivitas. Gradle biasanya default ke transitif, kecuali ketika tidak." Benarkah, Bung? ... Benarkah?
w3bshark
4
@ w3bshark saya pikir itu lucu. "default ke transitif, kecuali ketika tidak" cukup akurat dalam pengalaman saya.
Navin
4
@ w3bshark Saya tidak terlalu peduli dengan suara. Saya berbagi apa yang telah saya pelajari dengan komunitas.
Steve Kuo