Enregistrement des tâches Grunt dont le code se trouve dans les fichiers JavaScript externes

J'ai écrit une fonction que j'aimerais utiliser comme tâche Grunt. Je peux le faire en ajoutant ceci au Gruntfile:

grunt.registerTask('foo', function () { // code here }); 

Cependant, il est plus logique de conserver le code de fonction dans un fichier distinct. J'ai l'intention de définir un tas de ces tâches personnalisées et je ne veux pas hacher le Gruntfile.

Je ne suis pas sûr de la façon privilégiée d'enregistrer de telles tâches. J'ai trouvé cela fonctionner:

 grunt.registerTask('foo', function () { require('./path/to/foo.js')(grunt); }); 

Donc, j'ai la fonction en ligne comme dans le premier exemple, mais cette fois, je charge un fichier externe et je l'invoque immédiatement. Dans ce fichier externe, je dois écrire:

 module.exports = function (grunt) { // code here } 

Cela fonctionne, mais il se sent coupable. Existe-t-il une manière plus appropriée de faire cela?

Réponse courte: l'alternative à cela

 grunt.registerTask('foo', function () { require('./path/to/foo.js')(grunt); }); 

Est http://gruntjs.com/api/grunt#grunt.loadtasks

Longue réponse:

Normalement, lorsque vous avez des tâches dans des fichiers externes, il existe d'autres modules nodejs. Donc, si c'est quelque chose que vous utiliserez dans plusieurs projets, vous voudrez peut-être l'enregistrer dans le registre. Plus tard dans votre Gruntfile.js, vous aurez:

 grunt.loadNpmTasks('yout-module-here'); 

La documentation du Grunt dit:

 Load tasks from the specified Grunt plugin. This plugin must be installed locally via npm, and must be relative to the Gruntfile 

Cependant, si vous ne voulez rien télécharger dans le registre, vous devez utiliser LoadTasks

 grunt.loadTasks('path/to/your/task/directory'); 

Ainsi, une fois la tâche chargée, vous pouvez l'utiliser dans votre configuration.

Voici une simple tâche grunt placée dans un fichier externe:

 'use strict'; module.exports = function(grunt) { grunt.registerMultiTask('nameoftask', 'description', function() { var self = this; // this.data here contains your configuration }); }; 

Et plus tard dans Gruntfile.js

 grunt.initConfig({ nameoftask: { task: { // parameters here } } }); 

J'avais un problème similaire.

Je voulais moduler mes configurations grunt et tâches personnalisées par fonctionnalités (gros bloc UX / UI) plutôt que par des fonctionnalités techniques. Et je voulais garder les fichiers de configuration à côté des fichiers de tâche … (mieux lorsque vous travaillez sur une base de code héritage étendue avec une équipe variée – 5 personnes avec différentes connaissances de JS)

J'ai donc externalisé mes tâches comme Krasimir.

Au gruntfile, j'ai écrit:

 //power of globbing for loading tasks var tasksLocations = ['./grunt-config/default_tasks.js', './grunt-config/**/tasks.js']; var taskFiles = grunt.file.expand({ filter: "isFile" }, tasksLocations); taskFiles.forEach(function(path) { grunt.log.writeln("=> loading & registering : " + path); require(path)(grunt); }); 

Vous trouverez ici l'intégralité du fichier GruntFile (configuration externe et chargement des tâches): https://gist.github.com/0gust1/7683132