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):
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