63

我有一个节点/角度项目,它使用 npm 进行后端依赖管理,使用 bower 进行前端依赖管理。我想使用 grunt 任务来执行这两个安装命令。我一直无法弄清楚该怎么做。

我尝试使用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);
    });

};

当我cd进入前端,打开node并从控制台运行此代码时,它工作正常。我在 grunt 任务中做错了什么?

(我也尝试使用 bower 和 npm API,但也无法实现。)

4

5 回答 5

134

npm install要在安装服务器端库的同时安装客户端组件,您可以添加package.json

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

我更喜欢区分安装和测试/构建

于 2013-09-03T11:54:29.667 回答
35

.exec您需要通过调用this.async()方法、获取回调并在 exec 完成时调用它来告诉 grunt 您正在使用异步方法 ( )。

这应该有效:

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

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

于 2013-01-11T18:10:06.580 回答
7

仅供参考,这就是我现在的位置。

你也可以用另一种方式解决这个问题,即让 npm 处理 bower 的执行,最终让 grunt 处理 npm。请参阅将 bower 与 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();
    });
});
于 2013-03-07T04:09:55.503 回答
2

完成这项工作的 Grunt 任务(根据上面 Sindre 的解决方案):

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

于 2013-05-12T13:15:46.253 回答
2

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

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

将您的依赖项自动注入 index.html 文件

于 2014-01-27T10:04:27.900 回答