Automatiser npm et bower installer avec un grognement

J'ai un projet noeud / angulaire qui utilise npm pour la gestion de la dépendance du backend et le bower pour la gestion des dépendances frontend. J'aimerais utiliser une tâche géniale pour faire les deux commandes d'installation. Je n'ai pas été en mesure de comprendre comment le faire.

J'ai fait une tentative en utilisant exec , mais il n'installe en réalité rien.

 module.exports = function(grunt) { grunt.registerTask('install', 'install the backend and frontend dependencies', function() { // adapted from http://www.dzone.com/snippets/execute-unix-command-nodejs var exec = require('child_process').exec, sys = require('sys'); function puts(error, stdout, stderr) { console.log(stdout); sys.puts(stdout) } // assuming this command is run from the root of the repo exec('bower install', {cwd: './frontend'}, puts); }); }; 

Quand je fais le cd dans l'interface, ouvre le node et exécute ce code depuis la console, ça marche bien. Qu'est-ce que je fais mal dans la tâche gruante?

(J'ai également essayé d'utiliser les API bower et npm, mais je ne pouvais pas non plus le faire.)

Vous devez dire au grunt que vous utilisez une méthode asynchrone ( .exec ) en appelant la méthode this.async() , en obtenant un rappel et en appelant lorsque l'exécution est terminée.

Cela devrait fonctionner:

 module.exports = function(grunt) { grunt.registerTask('install', 'install the backend and frontend dependencies', function() { var exec = require('child_process').exec; var cb = this.async(); exec('bower install', {cwd: './frontend'}, function(err, stdout, stderr) { console.log(stdout); cb(); }); }); }; 

Voir Pourquoi ma tâche asynchrone n'est-elle pas terminée?

Pour installer les composants côté client pendant l' npm install au même moment que les bibliothèques côté serveur, vous pouvez ajouter votre package.json

 "dependencies": { ... "bower" : "" }, "scripts": { ... "postinstall" : "bower install" } 

Je préfère faire la différence entre l'installation et le test / la construction

FYI, voila où je suis pour le moment.

Vous pourriez également avoir pris le problème d'une autre façon, c'est-à-dire laisser npm gérer l'exécution de bower, et finalement laisser grunt gérer npm. Voir Utiliser bower avec heroku .

 grunt.registerTask('install', 'install the backend and frontend dependencies', function() { var async = require('async'); var exec = require('child_process').exec; var done = this.async(); var runCmd = function(item, callback) { process.stdout.write('running "' + item + '"...\n'); var cmd = exec(item); cmd.stdout.on('data', function (data) { grunt.log.writeln(data); }); cmd.stderr.on('data', function (data) { grunt.log.errorlns(data); }); cmd.on('exit', function (code) { if (code !== 0) throw new Error(item + ' failed'); grunt.log.writeln('done\n'); callback(); }); }; async.series({ npm: function(callback){ runCmd('npm install', callback); }, bower: function(callback){ runCmd('bower install', callback); } }, function(err, results) { if (err) done(false); done(); }); }); 

Grunt tâche qui fait juste ce travail (selon la solution Sindre ci-dessus):

https://github.com/ahutchings/grunt-install-dependencies

La tâche Grunt qui fait la commande d'installation Bower: https://github.com/yatskevich/grunt-bower-task

Vous pouvez également utiliser https://github.com/stephenplusplus/grunt-bower-install

Pour injecter automatiquement vos dépendances dans le fichier index.html