63 votes

Automatiser l'installation de npm et bower avec grunt

J'ai un projet node / angular qui utilise npm pour la gestion des dépendances du backend et bower pour la gestion des dépendances du frontend. J'aimerais utiliser une tâche grunt pour effectuer les deux commandes d'installation. Je n'ai pas réussi à trouver comment le faire.

J'ai fait une tentative en utilisant exec mais il n'installe rien en réalité.

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

};

Quand je cd dans le front-end, ouvrez node et exécutez ce code depuis la console, cela fonctionne bien. Qu'est-ce que je fais mal dans la tâche grunt ?

(J'ai également essayé d'utiliser les API bower et npm, mais cela n'a pas fonctionné non plus).

134voto

jsan Points 647

Pour installer les composants côté client pendant npm install en même temps que les librairies côté serveur, vous pouvez ajouter dans votre package.json

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

Je préfère faire la différence entre install et test/build

35voto

Sindre Sorhus Points 20538

Vous devez indiquer à grunt que vous utilisez une méthode asynchrone ( .exec ) en appelant le this.async() obtenir un rappel, et l'appeler lorsque l'exécution est terminée.

Cela devrait fonctionner :

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

Ver Pourquoi ma tâche asynchrone ne se termine-t-elle pas ?

7voto

xavier.seignard Points 3578

Pour info, voilà où j'en suis pour le moment.

Vous auriez également pu prendre le problème d'une autre manière, c'est-à-dire laisser npm gérer l'exécution de bower, et finalement laisser grunt gérer npm. Voir Utiliser bower avec 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();
    });
});

2voto

Itsik Avidan Points 346

Tâche Grunt qui exécute la commande bower install : https://github.com/yatskevich/grunt-bower-task

également, vous pouvez utiliser https://github.com/stephenplusplus/grunt-bower-install

pour injecter automatiquement vos dépendances dans le fichier index.html

2voto

nostopbutton Points 156

Tâche Grunt qui fait juste ce travail (comme dans la solution de Sindre ci-dessus) :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X