Co dokładnie robi transitive = true w Gradle (wrt crashlytics)?

174

Co transitive = truedokładnie robi Gradle ? Z dokumentacji Gradle nie wynika jasno . Dzieje się to w kontekście compilewnętrza build.gradle. W moim przypadku polegam na crashlytics Androida.

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

W kilku dokumentach Gradle ( tutaj i tutaj ) sugeruje się, że wartość „przechodnia” jest domyślnie włączona. Jednak usunięcie transitive = truepowoduje, że zależności przechodnie nie są wprowadzane (w szczególności KitGroup).

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

Doktorzy twierdzą, że domyślnie jest to prawda, ale rzeczywiste zachowanie wydaje się być odwrotne.

Używam Gradle 2.2.1. Być może zachowanie zmieniło się między 2,2 a 2,4?

Edycja : powiązane zależności przechodnie nie zostały rozwiązane dla biblioteki aar przy użyciu gradle

Steve Kuo
źródło
podczas definiowania konfiguracji, czy definiowania zależności?
dnault
Zależności plików jar są promowane do projektów podrzędnych. Nie każdy projekt musi jawnie definiować swoje zależności.
Konrad
Czego dokładnie nie jest jasne w tej dokumentacji ?
Oleg Estekhin
3
@OlegEstekhin dokumentacja nie pasuje do zachowania środowiska wykonawczego, które widzę
Steve Kuo

Odpowiedzi:

153

Używasz @aarnotacji.
Oznacza to, że chcesz pobrać tylko artefakt aar, bez żadnych zależności.
Możesz sprawdzić tę część dokumentacji :
Sprawdź 1.4.1.2. Artifact only notationsekcję:

Notacja zawierająca tylko artefakty tworzy zależność modułu, która pobiera tylko plik artefaktu z określonym rozszerzeniem. Istniejące deskryptory modułów są ignorowane .

Używając @aarnotacji, jeśli chcesz pobrać zależności, powinieneś dodać transitive=true.

Spodziewałbym się, że pomijanie @aar powinno działać bez dodawania atrybutu przechodniego.

Gabriele Mariotti
źródło
7
Potwierdziłem, że pomijanie @aar i usuwanie atrybutu przechodniego działa. Intencją jest to, aby programiści odwoływali się bezpośrednio do zestawów Fabric (np. „Compile” com.crashlytics.sdk.android:crashlytics:2.5.5 '"), a podstawowe klasy io.fabric.sdk.android były pobierane za pośrednictwem zależność przechodnia. Jeśli ustawisz przechodni = false, klasa io.fabric.sdk.android.Fabric nie zostanie znaleziona w czasie kompilacji.
Mark McClelland
7
ta „funkcja” jest tak zła, że ​​chcę aar z jej zależnościami. bez @aar szuka słoika i narzeka
dowi
12

Bardziej ogólna uwaga: ustawienie transitive = falsew crashlyticsbibliotece powoduje, że gradle ignoruje wszystkie biblioteki wymagane przez crashlytics(= "biblioteki przejściowe") i nie pobiera ich ani nie łączy.

Musisz ręcznie dodać wymagane biblioteki do projektu lub polegać na innych bibliotekach przejściowych dodanych przez inne zależności.

Domyślnie dla gradle jest transitive = true.

Przykłady i pełne wyjaśnienie tutaj: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

Vaiden
źródło
link nie działa. Obawiam się, że domyślnie nie jest to prawda, ponieważ w niektórych przypadkach piszemy konkretnie prawdę
Morozov
Naprawiono link @Morozov. Dzięki za GOTCHA!
Vaiden,
5

Domyślam się, że artefakt Crashlytics do którego masz na myśli ręcznie określa zależności jak nie przechodni ( transitive=false), dzięki czemu nie są zmuszeni do postawienia w zależności domyślnie. Dlatego widzisz odwrotne zachowanie. Na przykład niektórzy programiści mogą nie chcieć pobierać wszystkich usług Google Play lub czegokolwiek, z czego Crashlytics może korzystać, jeśli jest obecny.

Tak więc, usuwając to, Gradle nie pobiera już zależności i nie udaje mu się zbudować. W razie potrzeby możesz określić tę zależność ręcznie.

Biorąc to pod uwagę - myślę, że większym problemem jest to, że nie powinieneś odwoływać się bezpośrednio do artefaktu Crashlytics - powinieneś używać Fabric i w rezultacie wciągać Crashlytics: https://dev.twitter.com/fabric/ android / integracja

Sam Dozor
źródło
Instrukcje dotyczące migracji do Fabric określają bezpośrednie odwołanie do artefaktu Crashlytics, zakładając, że używasz tego „zestawu” Fabric: fabric.io/migrations/gradle
Mark McClelland
Wygląda na to, że intencją jest bezpośrednie odwoływanie się do zestawów, a one pobierają klasy io.fabric.sdk.android poprzez zależność przechodnią.
Mark McClelland
1

Ustawia, czy ta zależność powinna zostać rozwiązana, w tym lub z wykluczeniem jej zależności przechodnich. Artefakty należące do tej zależności mogą same mieć zależności od innych artefaktów. Te ostatnie nazywane są zależnościami przechodnimi.

user6703435
źródło
1

Gradle domyślnie śledzi zależności przechodnie. Jeśli chcesz to wyłączyć dla określonej biblioteki, użyj flagi przechodni.

Zmiana wartości flagi przechodni na false zapobiega pobieraniu zależności przechodnich, więc będziesz musiał samodzielnie dodać wszystko, co jest wymagane. Jeśli potrzebujesz tylko pliku jar modułu, bez żadnych dodatkowych zależności, możesz to również określić.

Hongyuan
źródło
2
Jaką wartość dodało to poza radą zawartą w bardzo pozytywnej odpowiedzi?
hrbrmstr
-19

transitivekontroluje przechodniość. Gradle zwykle przyjmuje wartość przechodnią, chyba że tak nie jest. Wystąpił błąd z przechodniością i klasyfikatorami, zobacz https://issues.gradle.org/browse/GRADLE-3188 .

Steve Kuo
źródło
39
Myślę, że to sprawiedliwe, że wskazałeś błąd. Ale twój opis nieruchomości nie jest pomocny. „Przechodni kontroluje przechodniość. Gradle normalnie ustawia wartość domyślną na przechodni, chyba że tak nie jest”. Naprawdę, koleś? ... Naprawdę?
w3bshark
4
@ w3bshark Myślałem, że to zabawne. Z mojego doświadczenia wynika, że ​​„domyślnie przechodnie, z wyjątkiem sytuacji, gdy tak nie jest”.
Navin
4
@ w3bshark Mógłbym mniej przejmować się głosami. Dzielę się tym, czego się nauczyłem, ze społecznością.
Steve Kuo