簡體   English   中英

使用grunt自動執行npm和bower安裝

[英]Automate npm and bower install with grunt

我有一個節點/角度項目,它使用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和npm API,但也無法使用。)

要在npm install期間與服務器端庫同時安裝客戶端組件,可以添加package.json

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

我更喜歡在安裝和測試/構建之間做出區分

你需要通過調用this.async()方法,獲取回調,並在exec完成時調用它來告訴grunt你正在使用異步方法( .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();
        });
    });
};

請參閱為什么我的異步任務沒有完成?

僅供參考,這是我現在所處的位置。

您也可以采用另一種方式解決問題,即讓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();
    });
});

完成這項工作的Grunt任務(根據Sindre的解決方案):

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

執行bower安裝命令的Grunt任務: https//github.com/yatskevich/grunt-bower-task

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

將您的依賴項自動注入index.html文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM