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コンソールからこのコードを実行すると、これは正常に機能します。単調なタスクで何が間違っていますか?

(bower API と npm API も使用しようとしましたが、どちらも機能しませんでした。)

4

5 に答える 5

35

メソッドを呼び出し、コールバックを取得し、exec が完了したときにそれを呼び出すこと.execによって、非同期メソッド ( )を使用していることを grunt に伝える必要があります。this.async()

これはうまくいくはずです:

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を処理させることができます。「 herokuでbowerを使用する」を参照してください。

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

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 に答える
2

このジョブだけを実行する Grunt タスク (上記の Sindre のソリューションによる):

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

于 2013-05-12T13:15:46.253 に答える