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();
});
});
};
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();
});
});
Grunt tarea que hace solo este trabajo (según la solución de Sindre anterior):
Grunt task que hace el comando bower install: https://github.com/yatskevich/grunt-bower-task
también, puedes usar https://github.com/stephenplusplus/grunt-bower-install
para inyectar automáticamente sus dependencias en el archivo index.html
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