2015-07-30 20 views
108

Cosa fa esattamente il Gradle transitive = true? Non è chiaro dallo Gradle documentation. Questo è nel contesto di compile all'interno di build.gradle. Nel mio caso sto dipendendo dai crash-tactics di Android.Che cosa fa transitive = true in Gradle esattamente come (crash.att.pr.)?

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

Diversi documenti Gradle (here e here) implica che le impostazioni predefinite "transitivo" vero. Tuttavia, la rimozione di transitive = true non comporta l'ingresso di dipendenze transitive (in particolare KitGroup).

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

I documenti dicono che il valore predefinito è true, ma il comportamento effettivo sembra essere l'opposto.

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

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

+0

quando si definiscono le configurazioni, o al momento di definire le dipendenze? – dnault

+0

Le dipendenze dei file jar vengono promosse in sottoprogetti. Non tutti i progetti devono definire le dipendenze in modo esplicito. – Konrad

+0

Cosa non è chiaro in [questa documentazione] (https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.Configuration.html#org.gradle.api.artifacts.Configuration:transitive) ? –

risposta

-8

transitive controlli transitività. Gradle normalmente è impostato su Transitive, tranne quando non lo fa. C'è un bug con transitività e classificatori, vedi https://issues.gradle.org/browse/GRADLE-3188.

+19

Penso che sia giusto che tu abbia indicato un bug. Ma la tua descrizione della proprietà non è utile. "transitività dei controlli transitivi: normalmente il gradino è transitivo, tranne quando non lo fa". Davvero, amico? ... Davvero? – w3bshark

+2

@ w3bshark Ho pensato che fosse divertente. "predefinito per transitivo, tranne quando non" è abbastanza preciso nella mia esperienza. – Navin

+1

@ w3bshark Mi potrebbe interessare di meno dei voti. Sto condividendo ciò che ho imparato con la comunità. –

4

La mia ipotesi è che il manufatto Crashlytics a cui ti riferisci manualmente specifica le dipendenze come non transitiva (transitive=false) in modo che non si è costretti a portare quelle dipendenze per impostazione predefinita. Ecco perché stai vedendo il comportamento opposto. Ad esempio, alcuni sviluppatori potrebbero non voler utilizzare tutti i servizi di Google Play o qualsiasi altra cosa che Crashlytics potrebbe utilizzare se presente.

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

Detto - Credo che il problema più grande a portata di mano è che non dovrebbe essere fa riferimento direttamente l'artefatto Crashlytics - si dovrebbe utilizzare tessuto, e tirando in Crashlytics come risultato: https://dev.twitter.com/fabric/android/integrating

+0

Grazie per i buoni consigli –

+0

Le istruzioni per la migrazione a Fabric specificano di fare riferimento al manufatto Crashlytics direttamente, presumendo che tu stia usando quel "kit" di tessuto: https://fabric.io/migrations/gradle – markproxy

+0

Sembra che tu voglia fa riferimento direttamente ai kit e inseriscono le classi io.fabric.sdk.android tramite la dipendenza transitiva. – markproxy

90

È stanno usando la notazione @aar.
Significa che si desidera scaricare solo l'artefatto di aar e nessuna dipendenza.
È possibile controllare questa parte del documentation:
Controllare la sezione 1.4.1.2. Artifact only notation:

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

Utilizzando la notazione @aar se volete scaricare le dipendenze, si dovrebbe aggiungere transitive=true.

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

+7

Ho confermato che omettere @aar e rimuovere l'attributo transitivo funziona. L'intenzione è che gli sviluppatori facciano riferimento esplicitamente ai kit Fabric (ad esempio, "compile 'com.crashlytics.sdk.android:crashlytics:2.5.5'"), e che le classi core io.fabric.sdk.android vengano attivate tramite dipendenza transitiva. Se si imposta transitive = false, la classe io.fabric.sdk.android.Fabric non verrà trovata in fase di compilazione. – markproxy

+3

questa "funzionalità" è così brutta, voglio un aar con le sue dipendenze. senza @aar cerca jar e si lamenta – dowi

0

Imposta se questa dipendenza deve essere risolta includendo o escludendo le sue dipendenze transitive. Gli artefatti che appartengono a questa dipendenza potrebbero avere delle dipendenze da altri artefatti.Queste ultime sono chiamate dipendenze transitive.

1

Il gradle segue le dipendenze transitive per impostazione predefinita. Se vuoi disattivarlo per una particolare libreria, usa la bandiera transitiva.

Cambiare il valore del flag di transizione su false impedisce il download delle dipendenze transitive, quindi dovrete aggiungere tutto ciò che è necessario. Se si desidera solo un modulo jar, senza alcuna dipendenza aggiuntiva, è possibile specificare anche questo.

+0

Quale valore ha aggiunto questo oltre il consiglio nella risposta altamente motivata? – hrbrmstr

-1

Su una nota più generale: Impostazione transitive = false sulle cause crashlytics biblioteca Gradle di ignorare tutte le librerie richieste da crashlytics (= "librerie temporanee") e non scaricare e collegarli.

È necessario aggiungere manualmente le librerie richieste al progetto o fare affidamento su altre librerie di transienti aggiunte da altre dipendenze.

L'impostazione predefinita per gradle è transitive = true.

Esempi e spiegazione completa qui: http://www.devsbedevin.com/android-understanding-gradle-dependencies-and-resolving-conflicts/

Problemi correlati