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.

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

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

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

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.