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.
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
}
});
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
}
}
Check-out grunt.util.spawn
:
grunt.util.spawn({
cmd: 'rm',
args: ['-rf', '/tmp'],
}, function done() {
grunt.log.ok('/tmp deleted');
});
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');
});
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);
});
Pour les commandes asynchrones utilisant Grunt 0.4.x, utilisez https://github.com/rma4ok/grunt-bg-Shell .