Exécuter une commande dans une tâche Grunt

94

J'utilise Grunt (outil de création de ligne de commande basé sur les 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" devrait appeler le fichier jar pour pré-compiler le fichier Soy en un fichier javascript.

J'exécute ce jar à partir de la ligne de commande, mais je veux le définir comme tâche.

JuanO
la source

Réponses:

105

Vous pouvez également charger des plugins grunt pour aider ceci:

Exemple de grunt-shell :

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

ou exemple 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
  }
}
papercowboy
la source
9
Est-ce que quelqu'un sait si l'un de ces deux est utilisable sous Windows?
Capaj
Je n'ai pas pu immédiatement grunt-shelltravailler avec Windows + Cygwin mais j'ai eu plus de chance avec grunt-exec.
Nathan
3
Existe-t-il un moyen d'utiliser grunt-exec de manière synchrone? Ce serait bien d'enchaîner les commandes
funseiki
1
@funseiki met simplement les commandes dans un batch ou un shell qui appelle les commandes dans l'ordre de votre choix. Ou vous définissez la tâche par exemple mycmds et écrivez "exec:cmd1", "exec:cmd2"alors vous avez également l'ordre synchronisé.
Sebastian
35

Découvrez grunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});
Nick Heiner
la source
5
avec opts: {stdio: 'inherit'},vous pouvez voir la sortie de la commande
JuanPablo
2
Remarque: le paramètre cmd doit être une chaîne et non un tableau.
RKI
1
Cela nécessite maintenant le grunt-legacy-utilplugin. Il recommande d'utiliser à la require('child_process').spawn()place.
JD
19

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

J'utilise grunt sous le nœud donc, pour appeler les commandes de terminal, vous devez avoir besoin du 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
    }
});
JuanO
la source
12
Une meilleure approche consiste à utiliser un plugin (ou à écrire le vôtre) pour conserver votre configuration grunt en tant que configuration et non en code. grunt-shell et grunt-exec en sont deux exemples.
papercowboy
Comme vous l'utilisez shavant, sh mayCommand.sh je ne suis pas sûr que cela fonctionnerait sous Windows
svassr
Cela ne fonctionnera pas car il s'agit de scripts bash. Je fonctionne sous Unix OS
JuanO
18

Si vous utilisez la dernière version de grunt (0.4.0rc7 au moment de la rédaction de cet article), grunt-exec et grunt-shell échouent (ils ne semblent pas être mis à jour pour gérer le dernier grunt). D'autre part, l'exec de child_process est asynchrone, ce qui est un problème.

J'ai fini par utiliser la solution de Jake Trent et ajouter shelljs en tant que dépendance de développement sur mon projet afin de pouvoir simplement 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');
});
kikito
la source
1
fyi grunt-shellfonctionne bien avec grunt v0.4.5sous Windows
fiat
Je pense que l'utilisation de shelljs est une excellente solution car elle permet à votre application de nœud d'accéder au shell et vous donne un contrôle plus fin sur celle-ci que les addons grunt seuls.
Nick Steele
14

Les gars pointent child_process, mais essayez d'utiliser execSync pour voir la sortie.

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
la source
Excellente solution sans plugins supplémentaires.
valentinvieriu
J'ai essayé d'exécuter des tâches en cours d'exécution pendant une journée, et enfin une solution simple qui fonctionne!
johnny 5