C'è un modo per dividere/fare in modo che le parti comuni di gradle build
-
24-09-2019 - |
Domanda
Abbiamo diverse build indipendenti (ogni build indipendente è una build multi-progetto). Le principali script di build diventano abbastanza grandi in quanto abbiamo una serie di compiti comuni riutilizzati dai sottoproietti e c'è molta ripetizione tra build indepedicenti. Quello che stiamo cercando è:
- Un modo per dividere il file di build principale in file più piccoli
- Un modo per riutilizzare alcune parti della build in altre build indipendenti
Qual è il modo migliore per raggiungerlo a Gradle?
Soluzione
Gradle 0.9 consente di importare uno script di build da un altro script di build. Dai un'occhiata a: Configurazione del progetto utilizzando uno script di build esterno. Fondamentalmente lo è apply from: 'other.gradle'
.
Una cosa che la Guida dell'utente non menziona è che il parametro "da" può essere un URL, quindi puoi rendere disponibili i tuoi script condivisi tramite HTTP da qualche parte (ad esempio il repository di sovversione) e importarli da più build.
Altri suggerimenti
La soluzione che ho trovato implica mappare le cose che hai nel tuo other.gradle
file.
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
}
Quindi, nel tuo build.gradle
file:
apply from: 'other.gradle'
// ...
android {
defaultConfig {
versionName VERConsts['NAME_CALL']()
// or
versionName VERConsts['NAME']
}
}
Poi il versionName
avrà il risultato della chiamata.
Appunti:
VERConsts['NAME'] = getVersionName()
chiameràgetVersionName()
e memorizzare il suo risultato. Usandolo nel tuo script, ad esempioversionName VERConsts['NAME']
Assegnerà quindi il valore memorizzato.VERConsts['NAME_CALL']
memorizzerà invece un riferimento alla funzione. UsandoVERConsts['NAME_CALL']()
Nel tuo script chiamerà effettivamente la funzione e assegnerà il risultato alla tua variabile
Il primo comporterà lo stesso valore assegnato attraverso lo script mentre il secondo può comportare valori diversi (ad esempio se qualcuno spinge un'altra versione mentre lo script è in esecuzione).