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.

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
  }
}

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


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
    }
});

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');
});

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);
});

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.