Что делает transitive = true в Gradle точно (w.r.t. crashlytics)?

Что делает Gradle transitive = true точно? Это не ясно из Gradle документации. Это находится в контексте compile внутри build.gradle. В моем случае я нахожусь в зависимости от Android-катастрофы.

compile('com.crashlytics.sdk.android:crashlytics:[email protected]') {
    transitive = true;
}

Несколько Gradle docs (здесь и здесь) подразумевают, что "транзитивный" по умолчанию имеет значение true. Однако удаление transitive = true приводит к тому, что транзитивные зависимости не приводятся (в частности, KitGroup).

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

Документы говорят, что значение по умолчанию равно true, но фактическое поведение выглядит противоположным.

Я запускаю Gradle 2.2.1. Возможно, поведение изменилось между 2.2 и 2.4?

Изменить: Связанные Транзитивные зависимости, не разрешенные для aar-библиотеки с помощью gradle

Ответ 1

Вы используете обозначение @aar.
Это означает, что вы хотите загрузить только артефакт aar и никаких зависимостей.
Вы можете проверить эту часть документация:
Проверьте раздел 1.4.1.2. Artifact only notation:

Обозначение только артефакта создает зависимость модуля, которая загружает только файл артефакта с указанным расширением. Существующие дескрипторы модуля игнорируются.

Используя ноту @aar, если вы хотите загрузить зависимости, вы должны добавить transitive=true.

Я ожидаю, что пропущение @aar должно работать без добавления переходного атрибута.

Ответ 2

На более общей ноте: Установка transitive = false в библиотеке crashlytics заставляет gradle игнорировать все библиотеки, требуемые crashlytics (= "временные библиотеки"), а не загружать и связывать их.

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

По умолчанию для gradle - transitive = true.

Примеры и полное объяснение здесь: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

Ответ 3

Я предполагаю, что артефакт Crashlytics, на который вы ссылаетесь вручную, определяет зависимости как непереходные (transitive=false), так что вы не обязаны вводить эти зависимости по умолчанию. Вот почему вы видите противоположное поведение. Например, некоторые разработчики могут не захотеть использовать все сервисы Google Play или что-либо еще, что Crashlytics может использовать, если он присутствует.

Таким образом, удалив это, Gradle больше не тянет в зависимости, и это не в состоянии строить. Вы можете указать эту зависимость вручную, если вам нужно.

Это сказанное - я думаю, что большая проблема под рукой - то, что вы не должны ссылаться на артефакт Crashlytics напрямую - вы должны использовать Fabric и в результате получить Crashlytics: https://dev.twitter.com/fabric/android/integrating

Ответ 4

Устанавливает необходимость разрешения этой зависимости, включая или исключая ее транзитивные зависимости. Артефакты, принадлежащие этой зависимости, могут иметь зависимости от других артефактов. Последние называются транзитивными зависимостями.

Ответ 5

Gradle по умолчанию использует транзитивные зависимости. Если вы хотите отключить это для конкретной библиотеки, используйте переходный флаг.

Изменение значения переходного флага на false предотвращает загрузку транзитивных зависимостей, поэтому вы должны добавить все, что вам нужно. Если вам нужен только модуль jar, без каких-либо дополнительных зависимостей, вы также можете указать это.

Ответ 6

По умолчанию зависимости Gradle равны transitive = true. Один модуль может зависеть от других модулей, и Gradle может обнаружить эти зависимости, когда разрешает объявленную зависимость от хранилища. Это почти всегда экономит время, но иногда может создавать проблемы.

Если вы зависите от версий module A v1 и module B v2, а module A транзитивно зависит от module B v3, вы можете не захотеть, чтобы Gradle разрешил эту окончательную зависимость. Неправильная версия файла JAR может превратить его в ваш путь к классам при компиляции или во время выполнения, и большинство разработчиков Java знают, какое это может быть неприятное впечатление.

К счастью, вы можете изменить разрешение переходных зависимостей, отключив его:

transitive = false 

Источник здесь

Ответ 7

transitive управляет транзитивностью. Gradle обычно по умолчанию является переходным, за исключением случаев, когда он этого не делает. Там ошибка с транзитивностью и классификаторами, см. https://issues.gradle.org/browse/GRADLE-3188.