用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):
执行bower安装命令的Grunt任务: https : //github.com/yatskevich/grunt-bower-task
另外,你可以使用https://github.com/stephenplusplus/grunt-bower-install
自动将您的dependency injection到index.html文件中