50 votes

Comment puis-je exécuter une tâche grunt à partir d'une autre tâche grunt ?

J'ai créé une nouvelle tâche grunt et dans celle-ci je veux utiliser grunt-contrib-concat pour concaténer quelques fichiers ensemble.

J'ai parcouru la documentation, mais je n'ai rien trouvé qui indique la possibilité de faire cela. Cela semble être un cas d'utilisation trivial, donc je suis probablement en train de surestimer quelque chose.

Mise à jour 1 :

Je souhaite également pouvoir configurer cette tâche à partir de ma tâche personnalisée.

Par exemple, je crée une liste de fichiers dans ma tâche personnalisée. Une fois que j'ai cette liste, je veux les passer à la tâche concat. Comment puis-je le faire ?

J'aimerais pouvoir faire quelque chose comme ça.

grunt.task.run('concat', { src: ['file1','file2'], dest: 'out.js'})

Mise à jour 2 :

Pour obtenir ce que je veux, je dois configurer manuellement la tâche grunt. Voici un exemple qui m'a montré ce que je voulais.

https://github.com/gruntjs/grunt-contrib/issues/118#issuecomment-8482130

9 votes

Le lien github ci-dessus est mort.

0 votes

Vous pourriez trouver cela utile : stackoverflow.com/questions/28847471/

34voto

Arron S Points 2302

Voici un exemple de configuration manuelle d'une tâche dans une tâche, puis de son exécution.

https://github.com/gruntjs/grunt-contrib/issues/118#issuecomment-8482130

 grunt.registerMultiTask('multicss', 'Minify CSS files in a folder', function() {
        var count = 0;
        grunt.file.expandFiles(this.data).forEach(function(file) {
            var property = 'mincss.css'+count+'.files';
            var value = {};
            value[file] = file;
            grunt.config(property, value);
            grunt.log.writeln("Minifying CSS "+file);
            count++;
        });
        grunt.task.run('mincss');
    });

27voto

Pascal Belloncle Points 5199

De https://github.com/gruntjs/grunt/wiki/Creating-tasks

grunt.registerTask('foo', 'My "foo" task.', function() {
  // Enqueue "bar" and "baz" tasks, to run after "foo" finishes, in-order.
  grunt.task.run('bar', 'baz');
  // Or:
  grunt.task.run(['bar', 'baz']);
});

0 votes

S'il vous plaît voir mon édition. J'ai ajouté les spécificités de la façon dont je veux utiliser concat à partir de ma tâche.

1 votes

Vous devez probablement configurer les tâches comme dans la réponse de @ArronS.

5 votes

Il y a une chose sur laquelle je suis tombé aujourd'hui. Si vous voulez exécuter la même tâche plusieurs fois mais avec des configurations différentes, alors c'est une mauvaise idée de passer des options à chaque tâche par le biais de grunt.config parce que les tâches sont mises en file d'attente et non exécutées, donc lorsqu'elles commencent à s'exécuter, seules les dernières valeurs de configuration attribuées seront effectives. Par exemple, si vous voulez planifier la concaténation de fichiers JS vers une destination et de fichiers CSS vers une autre destination, seule votre dernière configuration sera effective. Pour éviter cela, vous devez également configurer dynamiquement des cibles distinctes pour chaque tâche.

11voto

elmuchacho Points 345

Merci à Arron qui nous a aiguillé dans la bonne direction pour répondre à sa propre question. Le grunt.config est la clé de l'exemple ci-dessus. Cette tâche va remplacer la propriété src de la tâche browserify.

Définition de la tâche :

  grunt.registerTask('tests', function (spec) {

    if (spec) {
      grunt.config('browserify.tests.src', spec);
    }

    grunt.task.run(['jshint', 'browserify:tests', 'jasmine']);

  }); 

Appel de la tâche :

grunt tests

ou

grunt tests:somewhere/specPath.js

0voto

Shilpi Points 21

Comment pouvons-nous exécuter la même tâche plusieurs fois à partir d'une tâche par exemple.

grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {

  var done = this.async();
  // Run some sync stuff.
  grunt.log.writeln('Processing task...');
  var versions = Object.keys(versionConf);

  setTimeout(function() {
    versions.forEach(function(version) {
      console.info(version);
      //process.env.version = version;
      grunt.config('port', versionConf[version].port);
      grunt.task.run('test-perf');
    })
    done();
  }, 1000);

});

Je veux lancer test-perf avec port diff à chaque fois selon la version.

0voto

ruyadorno Points 323

Si vous vous sentez paresseux, j'ai fini par publier un module npm qui transmet les configurations de votre tâche à la sous-tâche que vous voulez exécuter :

https://www.npmjs.org/package/extend-grunt-plugin

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