2015-07-30 34 views
108

Co dokładnie robi Gradle transitive = true? Nie jest to jasne z poziomu Gradle documentation. Jest to w kontekście compile w obrębie build.gradle. W moim przypadku polegam na crashlytics Androida.Co robi funkcja przechodnia = true w Gradle (w.r.t. crashlytics)?

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

Kilka docs Gradle (here i here) wynika, że ​​"przechodnie" Domyślnie true. Jednak usunięcie transitive = true powoduje, że nie są przenoszone zależności przejściowe (w szczególności KitGroup).

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

Dokumenty mówią, że domyślnie są prawdziwe, ale faktyczne zachowanie wydaje się być odwrotnością.

Używam programu Gradle 2.2.1. Być może zachowanie zmieniło się pomiędzy 2.2 a 2.4?

Edit: Podobne Transitive dependencies not resolved for aar library using gradle

+0

podczas definiowania konfiguracji, czy przy określaniu zależności? – dnault

+0

Zależności plików jar są promowane do podprojektów. Nie każdy projekt musi wyraźnie określać jego zależności. – Konrad

+0

Co dokładnie nie jest jasne w [tej dokumentacji] (https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.Configuration.html#org.gradle.api.artifacts.Configuration:transitive) ? –

Odpowiedz

-8

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

+19

Myślę, że to uczciwe, że wskazałeś błąd. Ale twój opis nieruchomości nie jest pomocny. "przechodniość kontroli przechodnej, Gradle zwykle domyślnie przechowuje przechodnie, chyba że nie." Naprawdę, koleś? ... Naprawdę? – w3bshark

+2

@ w3bshark Myślałem, że to było zabawne. "domyślne przechodnie, z wyjątkiem tego, gdy nie jest" jest dość dokładne z mojego doświadczenia. – Navin

+1

@ w3bshark Mógłbym mniej przejmować się głosowaniem. Dzielę się tym, czego nauczyłem się ze społecznością. –

4

Domyślam się, że artefakt Crashlytics do którego masz na myśli ręcznie określa zależności jak nie przechodnich (transitive=false), dzięki czemu nie są zmuszeni do postawienia w zależności domyślnie. Dlatego widzisz przeciwne zachowanie. Na przykład niektórzy programiści mogą nie chcieć korzystać z wszystkich Usług Google Play ani z jakichkolwiek innych aplikacji, których mogą używać Crashlytics.

Po usunięciu tego, Gradle nie pobiera już zależności i nie można jej zbudować. Możesz określić tę zależność ręcznie, jeśli potrzebujesz.

Mając na uwadze powyższe - Myślę, że większym problemem jest to, że pod ręką nie powinno być przedstawieniu artefakt Crashlytics bezpośrednio - należy używać materiału i ciągnąc w Crashlytics wskutek: https://dev.twitter.com/fabric/android/integrating

+0

Dzięki za dobre wskazówki –

+0

Instrukcje dotyczące migracji do Fabric określają bezpośrednie odwoływanie się do artefaktu Crashlytics, zakładając, że używasz tego "zestawu" Fabric: https://fabric.io/migrations/gradle – markproxy

+0

Wygląda na to, że chcesz odnoszą się bezpośrednio do zestawów i pobierają klasy io.fabric.sdk.android przez zależność przechodnią. – markproxy

90

You używają notacji @aar.
Oznacza to, że chcesz pobrać tylko artefakt aar i nie ma zależności.
Można sprawdzić tę część documentation:
Sprawdź sekcję 1.4.1.2. Artifact only notation:

Artefakt tylko zapis tworzy zależność modułu, który pobiera tylko plik artefakt z określonym rozszerzeniem. Istniejące deskryptory modułów są ignorowane.

Stosując notację @aar jeśli chcesz pobrać zależnościami, należy dodać transitive=true.

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

+7

Potwierdziłem, że pomijanie @aar i usuwanie atrybutu przechodzenia działa. Chodzi o to, że programiści odwołują się bezpośrednio do zestawów Fabric (np. "Kompilują" com.crashlytics.sdk.android:crashlytics: 2.5.5 ""), a klasy core io.fabric.sdk.android są wczytywane przez zależność przechodnia. Jeśli ustawisz transitive = false, klasa io.fabric.sdk.android.Fabric nie zostanie znaleziona podczas kompilacji. – markproxy

+3

ta "cecha" jest tak zła, że ​​chcę mieć mocną zależność. bez @aar szuka słoiczka i narzeka – dowi

0

Ustawia, czy ta zależność powinna zostać rozwiązana, włączając lub wykluczając jej przechodnie zależności. Artefakty należące do tej zależności mogą mieć zależności od innych artefaktów.Te ostatnie nazywane są przejściowymi zależnościami.

1

Gradle domyślnie wykonuje zależności przechodnie. Jeśli chcesz wyłączyć tę opcję dla konkretnej biblioteki, użyj flagi przechodniów.

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

+0

Jaką wartość dodało to poza poradą w odpowiedzi na wiele głosów? – hrbrmstr

-1

Na bardziej ogólnym uwaga: Ustawianie transitive = false na temat przyczyn bibliotecznych crashlytics Gradle ignorować wszystkie biblioteki wymagane przez crashlytics (= „nieustalonych bibliotek”) i nie pobrać i połączyć je.

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

Wartość domyślna dla gradle to transitive = true.

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