Ejecutando un comando en una Tarea Grunt

94

Estoy usando Grunt (herramienta de construcción de línea de comandos basada en tareas para proyectos de JavaScript) en mi proyecto. He creado una etiqueta personalizada y me pregunto si es posible ejecutar un comando en ella.

Para aclarar, estoy tratando de usar plantillas de cierre y "la tarea" debería llamar al archivo jar para precompilar el archivo Soy en un archivo javascript.

Estoy ejecutando este jar desde la línea de comandos, pero quiero configurarlo como una tarea.

JuanO
fuente

Respuestas:

105

Alternativamente, puede cargar complementos grunt para ayudar con esto:

ejemplo de grunt-shell :

shell: {
  make_directory: {
    command: 'mkdir test'
  }
}

o ejemplo de grunt-exec :

exec: {
  remove_logs: {
    command: 'rm -f *.log'
  },
  list_files: {
    command: 'ls -l **',
    stdout: true
  },
  echo_grunt_version: {
    command: function(grunt) { return 'echo ' + grunt.version; },
    stdout: true
  }
}
vaquero de papel
fuente
9
¿Alguien sabe si alguno de esos dos es utilizable en Windows?
Capaj
No pude ponerme grunt-shella trabajar de inmediato con Windows + Cygwin, pero tuve más suerte con grunt-exec.
Nathan
3
¿Hay alguna forma de usar grunt-exec sincrónicamente? Sería bueno encadenar comandos juntos
funseiki
1
@funseiki simplemente coloca los comandos dentro de un lote o shell que llama a los comandos en su orden preferido. O define la tarea, por ejemplo, mycmds y escribe, "exec:cmd1", "exec:cmd2"entonces también tiene un orden sincrónico.
Sebastian
35

Mira grunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});
Nick Heiner
fuente
5
con opts: {stdio: 'inherit'},se puede ver la salida del comando
JuanPablo
2
Nota: cmd param debe ser una cadena, no una matriz.
RKI
1
Esto ahora requiere el grunt-legacy-utilcomplemento. Recomienda usar en su require('child_process').spawn()lugar.
JD
19

Encontré una solución, así que me gustaría compartirla contigo.

Estoy usando grunt debajo del nodo, por lo que para llamar a los comandos de la terminal, debe requerir el módulo 'child_process'.

Por ejemplo,

var myTerminal = require("child_process").exec,
    commandToBeExecuted = "sh myCommand.sh";

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});
JuanO
fuente
12
Un mejor enfoque es usar un complemento (o escribir el suyo propio) para mantener su configuración grunt como configuración y no como código. grunt-shell y grunt-exec son dos ejemplos.
papercowboy
Como lo usa shantes, sh mayCommand.sh no estoy seguro de que funcione en Windows
svassr
No funcionará porque es un script bash. Estoy ejecutando bajo Unix OS
JuanO
18

Si está utilizando la última versión de grunt (0.4.0rc7 en el momento de escribir este artículo), tanto grunt-exec como grunt-shell fallan (no parecen estar actualizados para manejar el último grunt). Por otro lado, el ejecutivo de child_process es asincrónico, lo cual es una molestia.

Terminé usando la solución de Jake Trent y agregando shelljs como una dependencia de desarrollo en mi proyecto para poder ejecutar pruebas de manera fácil y sincrónica:

var shell = require('shelljs');

...

grunt.registerTask('jquery', "download jquery bundle", function() {
  shell.exec('wget http://jqueryui.com/download/jquery-ui-1.7.3.custom.zip');
});
kikito
fuente
1
Fyi grunt-shellestá funcionando bien con grunt v0.4.5Windows
fiat
Creo que usar shelljs es una gran solución porque permite que su aplicación de nodo acceda al shell y le brinda un control más preciso sobre él que los complementos grunt solos.
Nick Steele
14

Los chicos están apuntando child_process, pero intenta usar execSync para ver la salida.

grunt.registerTask('test', '', function () {
        var exec = require('child_process').execSync;
        var result = exec("phpunit -c phpunit.xml", { encoding: 'utf8' });
        grunt.log.writeln(result);
});
Artjom Kurapov
fuente
Gran solución sin complementos adicionales.
valentinvieriu
He estado tratando de ejecutar tareas durante un día, ¡y finalmente una solución simple que funciona!
johnny 5 de