用grunt自动化npm和bower安装

我有一个node / angular项目,使用npm作为后端依赖pipe理,而bower作为前端依赖pipe理。 我想使用一个咕task任务来执行两个安装命令。 我一直无法弄清楚如何去做。

我试图使用exec ,但实际上并没有安装任何东西。

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

当我进入前端,打开node ,并从控制台运行这个代码,这工作正常。 我在做什么错误的咕task任务?

(我也尝试使用bower和npm API,但是也无法做到这一点。)

您需要通过调用this.async()方法来告诉grunt您正在使用asynchronous方法( .exec ),获取callback并在exec完成时调用该方法。

这应该工作:

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

请参阅为什么我的asynchronous任务没有完成?

要在npm install期间安装客户端组件,与服务器端libs同时npm install ,可以在package.json添加

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

我更喜欢在安装和testing/构build之间做出区别

仅供参考,这里是我现在的地方。

你也可以用另一种方式来解决问题,比如让npm处理bower的执行,最后让grunt处理npm。 请参阅使用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(); }); }); 

完成这项工作的咕task任务(按上述Sindre的解决scheme):

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

执行bower安装命令的Grunt任务: https : //github.com/yatskevich/grunt-bower-task

另外,你可以使用https://github.com/stephenplusplus/grunt-bower-install

自动将您的dependency injection到index.html文件中