2012-10-02 18 views
5

Ho un'attività che genera origini java e un set di giare da queste fonti (ad esempio, il progetto a). Vorrei esportare questi vasi in progetti dipendenti (ad esempio, progetto b). Quindi, ecco più o meno quello che ho in questo momento:Gradle - posso includere l'output dell'attività nelle dipendenze del progetto

//a.gradle 

configurations{ 
    generatedJars 
} 

task generateJars(type: JavaExec) { 
    //generate jars ... 

    outputs.files += //append generated jars here 
} 

dependencies{ 
    generatedJars generateJars.outputs.files 
} 


//b.gradle 

dependencies{ 
    project(path: ':a', configuration: 'generatedJars') 
} 

funziona bene, tranne che l'aggiunta di generateJars.outputs.files come dipendenza non dire Gradle che deve eseguire generateJars compito quando non ci sono vasi ancora generato. Ho provato ad aggiungere l'attività stessa come dipendenza sperando che funzionasse come quando si aggiunge un'attività jar/zip a una configurazione artefatto (es. artifacts{ myJarTask }), ma genera un errore che mi dice che non posso fare quella. Ovviamente posso iniettare l'attività generateJars da qualche parte nel processo di compilazione prima che :b inizi a valutare, ma è goffo e fragile, quindi vorrei evitarlo.

Mi sento come se dovessi aggiungere i vasi generati a artifacts{ ... } del progetto, ma non sono sicuro di come renderli visibili ai progetti dipendenti. C'è un modo migliore per raggiungere questo obiettivo?

I progetti dipendenti (progetto b) dovranno eseguire la configurazione del percorso classe IntelliJ IDEA del modulo in modo che punti ai getti generati dal progetto a. Qualcosa di un po 'come questa (pseudo-codice):

//b.gradle 

idea{ 
    module{ 
    scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files 
    } 
} 

Finora ho provato la semplice aggiunta di un dependecy progetto su :a s' generatedJars in :b, ma plug Idea aggiunge semplicemente modulo :a come modulo-dipendenza e presuppone che esporta i suoi jar generati (che è probabilmente un presupposto corretto), pertanto non aggiunge i jar generati al classpath di :b.

Qualsiasi aiuto sarebbe molto apprezzato!

risposta

2

In primo luogo, è necessaria una configurazione separata? Cioè, hai clienti di a che dovrebbero non vedere i giare generati? In caso contrario, è possibile aggiungere i jar generati alla configurazione archives, che semplificherà le cose.

In secondo luogo, il modo corretto per aggiungere i vasi generati per la configurazione è (al posto del blocco dependencies):

artifacts { 
    generatedJars generateJars 
} 

Questo dovrebbe fare in modo che il compito generateJars viene eseguito automaticamente quando necessario.

In terzo luogo, ometterei lo += dopo outputs.files, anche se potrebbe non fare la differenza. Dovresti anche aggiungere gli input necessari.

In quarto luogo, perché è necessario un task JavaExec per generare i jar? Puoi invece aggiungere le sorgenti generate ad un set sorgente e lasciare che Gradle le costruisca?

In quinto luogo, IDEA non ha un concetto corrispondente alle dipendenze di configurazione del progetto di Gradle. O un modulo IDEA dipende interamente da un altro modulo o non lo è affatto. Avete due opzioni: utilizzare una dipendenza del modulo e rendere le sorgenti generate una cartella sorgente del modulo dipendente (preferibilmente sia nel Gradle che nella build IDEA), o passare i Jars generati come dipendenze esterne a IDEA.In entrambi i casi, è consigliabile aggiungere una dipendenza di attività da ideaModule all'attività di generazione appropriata. Se ciò non porta ancora a una configurazione IDEA soddisfacente, si potrebbe pensare di spostare la generazione dei jar in un sottoprogetto separato.

+0

Grazie. Aggiungendo l'attività a 'artefacts' woks piacevolmente all'interno del modulo, ma non vedo come posso fare riferimento a quei vasi dal progetto' b' (senza pubblicarli). Sì, è possibile generare solo sorgenti ed esportarle come sorgente del modulo. Questo dovrebbe funzionare, ma crea un lavoro extra per IDEA, quindi speravo che potesse essere aggirato in qualche modo. Per fare in modo che l'idea di 'ideaModule -> generateJars' funzioni bene, devo anche aggiungere' b: ideaModule -> a: ideaModule', e ho circa 3 moduli che hanno tutti bisogno di farlo. Speravo di poterlo configurare in qualche modo per la risoluzione automatica. – rodion

+0

ad 1. 'project (percorso: 'a', configurazione: 'generatedJars')' –

+0

ad 2. Il "lavoro extra" è importante? (È possibile utilizzare lo stesso argomento per il codice non generato.) In ogni caso, è consigliabile compilare i file con Gradle anziché con un'attività JavaExec. –

Problemi correlati