Android

What does transitive = true in Gradle exactly do (w.r.t. crashlytics)?

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

Что именно делает Gradle transitive = true? Из документации Gradle неясно. Это в контексте compile within build.gradle . В моем случае я зависю от crashlytics Android.

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

Несколько документов Gradle (здесь и здесь) подразумевают, что "transitive" по умолчанию имеет значение 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 артефакт и никаких транзитивных зависимостей.

Вы можете проверить управление зависимостями в Gradle в официальной документации . В частности:


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


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

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

Ответ 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

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

java android gradle