2014-11-23 18 views
8

Sto cercando di eseguire un comando con Gradle con il compito di seguito:Esecuzione dei comandi con Gradle?

task stopServer(dependsOn: war, type: Exec) << { 
    commandLine 'pkill -9 tomcat' 
} 

quando l'eseguo ottengo il seguente errore:

* What went wrong: 
Execution failed for task ':stopServer'. 
> execCommand == null! 

E quando il mio compito è simile a questo:

task stopServer(dependsOn: war) << { 
    exec { 
     commandLine 'pkill -9 tomcat' 
    } 
} 

ottengo questo errore:

* What went wrong: 
Execution failed for task ':stopServer'. 
> A problem occurred starting process 'command 'pkill -9 tomcat'' 

Puoi dirmi dove sto andando male in ognuno di questi approcci?

Se nessuno dei due metodi indicati è corretto, specificare il modo in cui farlo probabilmente con un esempio.

+1

Questo in realtà non in forma come parte della mia risposta, ma ho davvero non pensare di voler 'pkill java'. Questo ucciderà qualsiasi processo java, incluso il tuo IDE, e potenzialmente gradle stesso. –

+0

L'ho cambiato in 'tomcat' –

+0

Nel caso in cui qualcuno dovesse ancora trovarsi di fronte a un problema, ho modificato il comando dx che sto affrontando per includere '.bat' come sotto e ha iniziato a funzionare. 'commandLine 'sdk/dx.bat '--dex' – Guna

risposta

16

Credo che stai cercando questo:

task stopServer(dependsOn: war, type: Exec) { 
    commandLine "pkill", " -9", "java" 
} 

La principale differenza è molto sottile - ho solo cancellato due personaggi. Lo << non è più presente nella definizione dell'attività. L'altra differenza è che il commandLine si aspetta che l'eseguibile venga passato separatamente dagli argomenti ad esso.

Ho rimosso il << a causa di un'idea importante in gradle: the build lifecycle. Ci sono le fasi di configurazione ed esecuzione (non è tutto, ma è sufficiente per spiegare questo).

Il << è come dire doLast - aggiunge la chiusura si passa alla fine delle azioni (la fase di esecuzione ) per questo compito. Questo significa che tenterà di eseguire il comando normalmente (è un oggetto Exec, dopotutto) e solo quindi, una volta eseguito, chiamerà il blocco, ovvero il blocco impostato commandLine. Quindi, quando è in esecuzione, execCommand è nullo e lo sarebbe fino a quando il blocco non è stato eseguito. Questo è il cuore del tuo problema.

Senza lo << (noto anche come spostamento a sinistra), quello stesso blocco viene eseguito durante la fase di configurazione . Quindi il comando exec viene impostato prima dell'esecuzione e funziona.

+0

Ho provato la tua soluzione ma non ho fortuna, sto ricevendo questo errore '> Si è verificato un problema durante l'avvio del comando' comando 'pkill -9 java''' –

+2

C'è stato un altro errore nella sintassi del comando riga. Gli argomenti devono essere separati dall'eseguibile. Ho aggiornato con la modifica. –

+0

La soluzione funziona ad esempio 'commandLine 'catalina.sh', 'run'' ma non per' commandLine' pkill ',' -9 ',' tomcat''. Qualche motivo? –

3

Ecco un'altra soluzione che funziona bene per lo stesso errore se si ha un'attività exec indipendente che si desidera eseguire dalla riga di comando ma non si desidera eseguire in Android Studio come parte della build.

Questo sarà sempre eseguire la configurazione di "myExecTask", ma sarà solo eseguire doMyExecTask quando viene esplicitamente eseguito tramite "myExecTask Gradle"

/** 
* Actually run exec task in doLast phase 
*/ 
task doMyExecTask << { 
    def hasProperties = project.hasProperty('SOME_PROPERTY'); 

    if (hasProperties) { 
     myExecTask.commandLine "echo", "$SOME_PROPERTY" 
    } else { 
     println "ERROR: Unable to run task. Missing properties." 
    } 
} 

/** 
* Configure exec task, this always runs 
*/ 
task myExecTask(type: Exec) { 
    dependsOn doMyExecTask 
    workingDir 'path/to/executable' 
}