web-dev-qa-db-fra.com

Exécuter une commande dans une tâche Grunt

J'utilise Grunt (outil de génération de ligne de commande basé sur des tâches pour les projets JavaScript) dans mon projet. J'ai créé une balise personnalisée et je me demande s'il est possible d'y exécuter une commande.

Pour clarifier, j'essaie d'utiliser des modèles de fermeture et "la tâche" doit appeler le fichier jar pour compiler à l'avance le fichier Soy dans un fichier javascript.

J'utilise ce fichier depuis la ligne de commande, mais je veux le définir comme tâche.

92
JuanO

J'ai trouvé une solution alors j'aimerais partager avec vous.

J'utilise grunt sous noeud donc, pour appeler des commandes de terminal, vous devez utiliser le module 'child_process'.

Par exemple,

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

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});
19
JuanO

Sinon, vous pouvez charger des plugins Grunt pour aider ceci:

grunt-Shell exemple:

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

ou grunt-exec exemple:

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

Check-out grunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});
34
Nick Heiner

Si vous utilisez la dernière version de Grunt (0.4.0rc7 au moment de l'écriture), les commandes grunt-exec et grunt-Shell échouent (elles ne semblent pas avoir été mises à jour pour prendre en charge le dernier grunt). D'autre part, exec de child_process est async, ce qui est un problème.

J'ai fini par utiliser solution de Jake Trent , et en ajoutant shelljs en tant que dépendance de dev sur mon projet afin de pouvoir exécuter des tests facilement et de manière synchrone:

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

Les gars pointent child_process, mais essayez d'utiliser execSync pour voir le résultat.

grunt.registerTask('test', '', function () {
        var exec = require('child_process').execSync;
        var result = exec("phpunit -c phpunit.xml", { encoding: 'utf8' });
        grunt.log.writeln(result);
});
14
Artjom Kurapov

Pour les commandes asynchrones utilisant Grunt 0.4.x, utilisez https://github.com/rma4ok/grunt-bg-Shell .

2
Daniel Steigerwald