2015-11-24 10 views
10

Voglio passare una variabile da un'attività all'altra, nello stesso file build.gradle. Il mio primo compito gradle tira l'ultimo messaggio di commit e ho bisogno che questo messaggio venga passato a un'altra attività. Il codice è sotto Grazie per l'aiuto in anticipo.Gradle: passaggio di variabile da un'attività all'altra

task gitMsg(type:Exec){ 
    commandLine 'git', 'log', '-1', '--oneline' 
    standardOutput = new ByteArrayOutputStream() 
    doLast { 
     String output = standardOutput.toString() 
    } 
} 

Voglio passare la variabile 'output' nell'attività seguente.

task notifyTaskUpcoming << { 
    def to = System.getProperty("to") 
    def subj = System.getProperty('subj') 
    def body = "Hello... " 
    sendmail(to, subj, body) 
} 

Voglio incorporare il messaggio git in "corpo".

risposta

9

È possibile definire una variabile output al di fuori del metodo doLast, ma nella radice di script e quindi semplicemente utilizzarla in un'altra attività. Ad esempio:

//the variable is defined within script root 
def String variable 

task task1 << { 
    //but initialized only in the task's method 
    variable = "some value" 
} 

task task2 << { 
    //you can assign a variable to the local one 
    def body = variable 
    println(body) 

    //or simply use the variable itself 
    println(variable) 
} 
task2.dependsOn task1 

Qui sono definite 2 attività. Task2 dipende da Task1, che significa che il secondo verrà eseguito solo dopo il primo. Il variable di tipo String viene dichiarato in root dello script di build e inizializzato nel metodo task1doLast (nota, << è uguale a doLast). Quindi la variabile viene inizializzata, potrebbe essere utilizzata da qualsiasi altra attività.

+0

Grazie mille! Devo assolutamente provarlo ... molto apprezzato! =) – crystallinity

+0

Grazie per questo grande esempio. Complimenti a te, fratello! –

26

Penso proprietà globali dovrebbero essere evitati e Gradle vi offre un bel modo per farlo con l'aggiunta di oggetti da un compito:

task task1 { 
    doLast { 
      task1.ext.variable = "some value" 
    } 
} 

task task2 { 
    dependsOn task1 
    doLast { 
     println(task1.variable) 
    } 
} 
+2

Ottimo per conoscere un altro metodo - grazie! Perché le proprietà globali dovrebbero essere evitate? – crystallinity

+3

perché è troppo facile perdere il contesto perché è stata utilizzata una proprietà globale. avendo la variabile direttamente vincolata all'attività che la produce, è più vicina al design OO comune e penso sia più facile da tracciare. (solo i miei 2 centesimi qui) –

+0

Vedo. Cool - grazie ancora per il tuo tempo e input =) – crystallinity

Problemi correlati