Що саме робить Transitive = true у Gradle (wrt crashlytics)?


174

Що transitive = trueточно робить Gradle ? З документації Gradle це не ясно . Це в контексті compileвсередині build.gradle. У моєму випадку я залежу від аварійних ситуацій Android.

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

Кілька документів Gradle ( тут і тут ) означають, що "перехідні" за замовчуванням істинні. Однак усунення transitive = trueрезультатів не сприймає перехідні залежності (зокрема KitGroup).

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

Документи стверджують, що це значення за замовчуванням до істинного, але фактична поведінка здається протилежною.

Я працюю Gradle 2.2.1. Можливо, поведінка змінилася між 2.2 і 2.4?

Редагувати : пов'язані транзитивні залежності не вирішені для бібліотеки AAR за допомогою gradle


при визначенні конфігурацій чи при визначенні залежностей?
dnault

Залежності файлів jar піднімаються до підпроектів. Не кожен проект повинен чітко визначати його залежності.
Конрад

Що саме не зрозуміло в цій документації ?
Олег Естехін

3
@OlegEstekhin документація не відповідає поведінці, яку я бачу
Стів Куо,

Відповіді:


153

Ви використовуєте @aarпозначення.
Це означає, що ви хочете завантажити лише артефакт arar, і ніяких залежностей.
Ви можете перевірити цю частину документації :
Перевірте 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 він шукає банку та скаржиться
dowi

12

На загальніші відомості: налаштування transitive = falseв crashlyticsбібліотеці змушує gradle ігнорувати всі бібліотеки, необхідні crashlytics(= "перехідні бібліотеки"), а не завантажувати їх і не посилати на них.

Вам доведеться або вручну додати потрібні бібліотеки до свого проекту, або покластися на інші перехідні бібліотеки, додані іншими залежностями.

Типовим для gradle є transitive = true.

Приклади та повне пояснення тут: http://www.devsbedevin.net/android-understanding-gradle-dependitions-and-resolving-conflicts/


посилання не працює. Боюся, це не за замовчуванням правда, тому що в деяких випадках спеціально пишуть правду
Морозов

@Morozov посилання виправлено. Дякую за GOTCHA!
Вайден

5

Я вважаю, що артефакт Crashlytics , до якого ви маєте в вигляді вручну визначає залежно , як НЕ транзитивно ( transitive=false) , так що ви не зобов'язані довести цю залежність , за замовчуванням. Ось чому ви бачите протилежну поведінку. Наприклад, деякі розробники можуть не захотіти використовувати всі сервіси Google Play або інше, що Crashlytics можуть використовувати, якщо вони є.

Отже, усунувши це, Градле більше не тягне в залежність, і він не в змозі наростити. Ви можете вказати цю залежність вручну, якщо вам потрібно.

З цього приводу - я думаю, що найбільша проблема полягає в тому, що вам не слід посилатися на артефакт Crashlytics безпосередньо - ви повинні використовувати Fabric і втягувати Crashlytics як результат: https://dev.twitter.com/fabric/ android / інтегруючий


Інструкція щодо переходу на Fabric вказує на посилання на артефакт Crashlytics безпосередньо, припускаючи, що ви використовуєте цей "комплект" тканини: fabric.io/migrations/gradle
Марк Макклелленд

Схоже, наміром є те, що ви посилаєтесь на набори безпосередньо, і вони перетягують класи io.fabric.sdk.android через перехідну залежність.
Марк МакКлелленд

1

Встановлює, чи повинна ця залежність вирішуватися, включаючи або виключаючи її перехідні залежності. Артефакти, що належать до цієї залежності, можуть залежати від інших артефактів. Останні називаються перехідними залежностями.


1

Gradle за замовчуванням дотримується перехідних залежностей. Якщо ви хочете вимкнути це для певної бібліотеки, використовуйте перехідний прапор.

Зміна значення перехідного прапора на помилкове перешкоджає завантаженню перехідних залежностей, тому вам доведеться самостійно додавати все, що потрібно. Якщо ви хочете лише модульну банку, без додаткових залежностей, ви можете також вказати це.


2
Яке значення це додало поза порадами у висококваліфікованій відповіді?
hrbrmstr

-19

transitiveконтролює транзитивність. Зазвичай Gradle за замовчуванням переходить до перехідного, за винятком випадків, коли цього немає. Існує помилка з транзитивністю та класифікаторами, див. Https://isissue.gradle.org/browse/GRADLE-3188 .


39
Я думаю, що справедливо, що ти вказав на помилку. Але ваш опис цього об’єкта не корисний. "транзитивний керує транзитивністю. Gradle зазвичай за замовчуванням застосовується до транзитивного, за винятком випадків, коли цього немає". Дійсно, чувак? ... Дійсно?
w3bshark

4
@ w3bshark Я подумав, що це смішно. "за замовчуванням на транзитивне, за винятком випадків, коли цього немає", на мій досвід досить точне.
Навін

4
@ w3bshark Мені було б менше байдуже голосів. Я ділюсь тим, що я дізнався з громадою.
Стів Куо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.