javascript node.js npm bower gruntjs

javascript - Automatice la instalación de npm y bower con gruñido



node.js gruntjs (5)

Tengo un proyecto de nodo / angular que usa npm para administración de dependencias de back-end y bower para administración de dependencias de frontend. Me gustaría utilizar una tarea de grunt para hacer ambos comandos de instalación. No he podido averiguar cómo hacerlo.

exec usar exec , pero en realidad no instala nada.

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

Cuando cd en la interfaz, abro el node y ejecuto este código desde la consola, esto funciona bien. ¿Qué estoy haciendo mal en la tarea gruñona?

(También traté de usar las API bower y npm, pero tampoco pude hacer eso).


Debes decirle a grunt que estás usando un método asíncrono ( .exec ) llamando al método this.async() , obteniendo una devolución de llamada y llamándolo cuando se haga el exec.

Esto debería funcionar:

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

Ver ¿Por qué mi tarea asíncrona no se completa?


FYI, aquí es donde estoy por ahora.

También podría haber tomado el problema de otra manera, es decir, dejar que npm maneje la ejecución de bower y, finalmente, dejar que gruñido maneje npm. Ver Usar bower con 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(); }); });




Para instalar los componentes del lado del cliente durante la npm install al mismo tiempo que las librerías del lado del servidor, puede agregarlo en su package.json . package.json

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

Prefiero hacer la diferencia entre instalar y probar / construir