Что именно делает переходный = true в Gradle (без сбоев)?


174

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

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

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

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

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

Я бегу Gradle 2.2.1. Возможно, поведение изменилось между 2,2 и 2,4?

Изменить : Связанные переходные зависимости не разрешены для библиотеки AAR с использованием Gradle


при определении конфигураций или при определении зависимостей?
Дне

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

Что именно не ясно в этой документации ?
Олег Эстехин

3
@OlegEstekhin документация не соответствует поведению во время выполнения, которое я вижу
Стив Куо

Ответы:


153

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

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

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

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


7
Я подтвердил, что пропуск @aar и удаление переходного атрибута работает. Здесь предполагается, что разработчики ссылаются на комплекты Fabric явным образом (например, «compile» com.crashlytics.sdk.android:crashlytics:2.5.5 '») и что основные классы io.fabric.sdk.android могут быть получены с помощью переходная зависимость. Если вы установите transitive = false, то класс io.fabric.sdk.android.Fabric не будет найден во время компиляции.
Марк Макклелланд,

7
эта "особенность" настолько плоха, что я хочу aar с его зависимостями. без @aar он ищет банку и жалуется
dowi

12

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

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

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

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


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

@ Морозов ссылка исправлена. Спасибо за GOTCHA!
Вайден

5

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

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

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


В инструкциях по миграции на Fabric указана прямая ссылка на артефакт Crashlytics, при условии, что вы используете этот «комплект» Fabric: fabric.io/migrations/gradle
Марк МакКлелланд,

Похоже, что вы подразумеваете, что вы ссылаетесь на наборы напрямую, а они используют классы io.fabric.sdk.android через транзитивную зависимость.
Марк Макклелланд,

1

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


1

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

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


2
Какую ценность это добавило к совету в ответе с сильным голосом?
hrbrmstr

-19

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


39
Я думаю, это справедливо, что вы указали на ошибку. Но ваше описание собственности не поможет. «Транзитивный контроль транзитивности. Обычно Gradle по умолчанию транзитивен, за исключением случаев, когда это не так». Правда, чувак? ... Правда?
w3bshark

4
@ w3bshark Я думал, что это смешно. «по умолчанию переходный, за исключением случаев, когда это не так» - довольно точно в моем опыте.
Навин

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