2010-04-02 5 views
41

Abbiamo diverse build indipendenti (ogni build indipendente è una build multiprogetto). Gli script di compilazione principali diventano piuttosto grandi in quanto abbiamo una serie di attività comuni riutilizzate dai sottoprogetti così come vi è molta ripetizione tra le build indipedenti. Quello che stiamo cercando è:C'è un modo per suddividere/estrapolare parti comuni di Gradle build

  1. Un modo per dividere principale build file in file più piccoli
  2. Un modo per riutilizzare alcune parti del costruire in altro indipendente costruisce

Qual è la miglior modo per farlo a Gradle?

risposta

41

Gradle 0.9 consente di importare uno script di build da un altro script di build. Date un'occhiata a: Configuring the project using an external build script. Fondamentalmente è apply from: 'other.gradle'.

Una cosa che la guida per l'utente non menziona è che il parametro 'from' può essere un URL, quindi è possibile rendere gli script condivisi disponibili via HTTP da qualche parte (ad es.

+0

Grazie per il collegamento. Pensi che 0.8 supporti quella funzione? –

+0

No, è una nuova funzionalità in 0.9 –

+0

grrrr, il collegamento è stato interrotto, è necessario scavare da solo ora. –

25

La soluzione che ho trovato implica la mappatura delle cose che hai nel tuo file other.gradle.

def getVersionName = { -> 
    def stdout = new ByteArrayOutputStream() 
    exec { 
     commandLine 'git', 'describe', '--tags' 
     standardOutput = stdout 
    } 
    return stdout.toString().trim() 
} 
ext{ 
    VERConsts = [:] 
    VERConsts['NAME'] = getVersionName() 
    VERConsts['NAME_CALL'] = getVersionName 
} 

Poi, nel file build.gradle:

apply from: 'other.gradle' 
// ... 
android { 
    defaultConfig { 
     versionName VERConsts['NAME_CALL']() 
     // or 
     versionName VERConsts['NAME'] 
    } 
} 

Poi, il versionName avrà il risultato chiamata.

Note:

  • VERConsts['NAME'] = getVersionName() chiamerà getVersionName() e memorizzarne il risultato. Usandolo nel tuo script, ad es. versionName VERConsts['NAME'] assegnerà quindi il valore memorizzato.
  • VERConsts['NAME_CALL'] memorizzerà invece un riferimento alla funzione. Utilizzando VERConsts['NAME_CALL']() nello script effettivamente chiamare la funzione e assegnare il risultato alla variabile

Il primo provocherà lo stesso valore assegnato attraverso lo script mentre quest'ultimo può comportare valori diversi (ad esempio, se qualcuno spinge un'altra versione mentre lo script è in esecuzione).

+0

In realtà ho trovato questo più utile dell'altra risposta per la condivisione dei metodi di build script helper tra i progetti. –

+0

Questa risposta è stata la più utile per me. Grazie! –

+0

puoi dare un esempio non-android? cos'è versionName VERConsts ['NAME_CALL']()? come eseguirlo nel pulito progetto java gradle? – user3871754