Cosa fa esattamente transitive = true in Gradle (wrt crashlytics)?


174

Cosa fa transitive = trueesattamente Gradle ? Non è chiaro dalla documentazione Gradle . Questo è nel contesto di compiledentro build.gradle. Nel mio caso, dipendo dai crashlytics di Android.

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

Diversi documenti Gradle ( qui e qui ) implicano che il valore predefinito "transitivo" è vero. Tuttavia, la rimozione di transitive = truerisultati in dipendenze transitive non viene introdotta (in particolare KitGroup).

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

I documenti dicono che il valore predefinito è vero, ma il comportamento reale sembra essere il contrario.

Sto eseguendo Gradle 2.2.1. Forse il comportamento è cambiato tra 2.2 e 2.4?

Modifica : dipendenze transitive correlate non risolte per la libreria aar usando gradle


quando si definiscono le configurazioni o quando si definiscono le dipendenze?
dnault,

Le dipendenze dei file jar vengono promosse in sottoprogetti. Non tutti i progetti devono definire esplicitamente le proprie dipendenze.
Konrad,

Cosa non è esattamente chiaro in questa documentazione ?
Oleg Estekhin,

3
@OlegEstekhin la documentazione non corrisponde al comportamento in fase di esecuzione che sto vedendo
Steve Kuo,

Risposte:


153

Stai usando la @aarnotazione.
Significa che vuoi scaricare solo l'artefatto aar e nessuna dipendenza.
È possibile controllare questa parte della documentazione :
controllare la 1.4.1.2. Artifact only notationsezione:

Una notazione solo artefatto crea una dipendenza del modulo che scarica solo il file artefatto con l'estensione specificata. I descrittori dei moduli esistenti vengono ignorati .

Utilizzando la @aarnotazione se si desidera scaricare le dipendenze, è necessario aggiungere transitive=true.

Mi aspetto che omettendo @aar dovrebbe funzionare senza aggiungere l'attributo transitivo.


7
Ho confermato che l'omissione di @aar e la rimozione dell'attributo transitivo funzionano. L'intenzione qui è che gli sviluppatori facciano esplicito riferimento ai kit Fabric (ad es. "Compila 'com.crashlytics.sdk.android:crashlytics:2.5.5'"), e che le classi core io.fabric.sdk.android vengano richiamate tramite dipendenza transitiva. Se si imposta transitive = false, la classe io.fabric.sdk.android.Fabric non verrà trovata al momento della compilazione.
Mark McClelland,

7
questa "caratteristica" è così male, voglio un aar con le sue dipendenze. senza @aar cerca jar e si lamenta
dowi,

12

In una nota più generale: l'impostazione transitive = falsesulla crashlyticslibreria fa sì che Gradle ignori tutte le librerie richieste da crashlytics(= "librerie transitorie") e non le scarichi e le colleghi.

Dovresti aggiungere manualmente le librerie richieste al tuo progetto o fare affidamento su altre librerie transitorie aggiunte da altre dipendenze.

L'impostazione predefinita per Gradle è transitive = true.

Esempi e spiegazioni complete qui: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/


il collegamento non funziona. Temo che non sia vero per impostazione predefinita, perché in alcuni casi in particolare si scrive true
Morozov,

Collegamento @Morozov risolto. Grazie per il GOTCHA!
Vaiden,

5

La mia ipotesi è che l'artefatto di Crashlytics a cui ti riferisci manualmente specifichi le dipendenze come non transitive ( transitive=false) in modo da non essere obbligato a riportarle per impostazione predefinita. Ecco perché stai vedendo il comportamento opposto. Ad esempio alcuni sviluppatori potrebbero non voler inserire tutti i servizi di Google Play o qualsiasi altra cosa che Crashlytics potrebbe usare se presente.

Quindi, rimuovendolo, Gradle non attira più la dipendenza e non riesce a costruire. È possibile specificare tale dipendenza manualmente, se necessario.

Detto questo - penso che il problema più grande a portata di mano sia che non dovresti fare riferimento direttamente al manufatto Crashlytics - dovresti usare Fabric e tirare di conseguenza Crashlytics: https://dev.twitter.com/fabric/ Android / integrazione


Le istruzioni per la migrazione a Fabric specificano il riferimento diretto al manufatto Crashlytics, presumendo che tu stia utilizzando quel "kit" Fabric: fabric.io/migrations/gradle
Mark McClelland,

Sembra che l'intenzione sia quella di fare riferimento direttamente ai kit e che inseriscono le classi io.fabric.sdk.android tramite dipendenza transitiva.
Mark McClelland,

1

Imposta se questa dipendenza deve essere risolta includendo o escludendo le sue dipendenze transitive. I manufatti appartenenti a questa dipendenza potrebbero essi stessi avere dipendenze da altri manufatti. Questi ultimi sono chiamati dipendenze transitive.


1

Gradle segue le dipendenze transitive per impostazione predefinita. Se vuoi disattivarlo per una particolare libreria, usa il flag transitivo.

La modifica del valore del flag transitivo su false impedisce il download di dipendenze transitive, quindi dovrai aggiungere tu stesso tutto ciò che è richiesto. Se si desidera solo un jar del modulo, senza dipendenze aggiuntive, è possibile specificare anche quello.


2
Quale valore ha aggiunto questo oltre al consiglio nella risposta altamente votata?
hrbrmstr,

-19

transitivecontrolla la transitività. Per impostazione predefinita, Gradle è di tipo transitivo, tranne quando non lo è. C'è un bug con transitività e classificatori, vedi https://issues.gradle.org/browse/GRADLE-3188 .


39
Penso che sia giusto che tu abbia segnalato un bug. Ma la tua descrizione della proprietà non è utile. "Transitive controlla la transitività. Gradle normalmente viene impostato su Transitive, tranne quando non lo è." Davvero, amico? ... Davvero?
w3bshark,

4
@ w3bshark Ho pensato che fosse divertente. "Il valore predefinito è transitivo, tranne quando non lo è" è abbastanza preciso nella mia esperienza.
Navin,

4
@ w3bshark Non me ne potrebbe fregare di meno dei voti. Sto condividendo ciò che ho imparato con la community.
Steve Kuo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.