web-dev-qa-db-de.com

Automatisieren Sie die Installation von npm und bower mit einem Grunzen

Ich habe ein Node/angular) - Projekt, das npm für das Backend-Abhängigkeitsmanagement und bower für das Frontend-Abhängigkeitsmanagement verwendet. Ich würde gerne eine Grunt-Task verwenden, um beide Installationsbefehle auszuführen in der Lage, herauszufinden, wie es geht.

Ich habe versucht, exec zu verwenden, aber es wird nichts installiert.

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

};

Wenn ich cd in das Frontend öffne node und diesen Code über die Konsole ausführe, funktioniert dies einwandfrei. Was mache ich falsch in der Grunzaufgabe?

(Ich habe auch versucht, die Bower- und Npm-APIs zu verwenden, aber auch das hat nicht funktioniert.)

63
Nick Heiner

Sie müssen grunt mitteilen, dass Sie eine asynchrone Methode (.exec) Verwenden, indem Sie die this.async() -Methode aufrufen, einen Rückruf erhalten und diese aufrufen, wenn exec abgeschlossen ist.

Das sollte funktionieren:

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

Siehe Warum wird meine asynchrone Aufgabe nicht abgeschlossen?

35
Sindre Sorhus

So installieren Sie clientseitige Komponenten während npm install gleichzeitig mit serverseitigen Bibliotheken können Sie in Ihrem package.json

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

Ich ziehe es vor, den Unterschied zwischen Installieren und Testen/Erstellen zu machen

134
jsan

Zu Ihrer Information, hier bin ich jetzt.

Sie hätten das Problem auch auf andere Weise lösen können, d. H. Npm die Ausführung von bower und grunt schließlich npm. Siehe Benutze Laube mit Herok .

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

Grunt-Aufgabe, die genau diese Aufgabe erfüllt (gemäß der obigen Lösung von Sindre):

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

2
nostopbutton

Grunt-Task, die den Bower-Installationsbefehl ausführt: https://github.com/yatskevich/grunt-bower-task

sie können auch https://github.com/stephenplusplus/grunt-bower-install verwenden

um Ihre Abhängigkeiten automatisch in die Datei index.html einzufügen

2
Itsik Avidan