Avancé Intermédiaire

Grunt (5) : Exécuter des tâches

Grunt : The JavaScript Task Runner

Vous avez toutes les billes pour créer vos tâches Grunt, mais savez-vous les lancer ?

Vous apprendrez dans cet article les différentes façons d’exécuter une tâche avec ou sans option et comment lui passer des arguments.

Piqûre de rappel : où en sommes-nous ?

Dans cette série d’articles sur Grunt, vous avez pu :

  1. Découvrir Grunt dans son ensemble
  2. Avoir un aperçu de l’API Grunt basée sur celle de node.js
  3. Comprendre comment configurer les tâches Grunt
  4. Apprendre à créer des tâches

Vous êtes donc prêts à lancer vos tâches ! Euh… Oui mais comment ?

Que contient cet article ?

Cet article vous donne toutes les clés pour comprendre comment exécuter vos tâches Grunt.

Exécuter des tâches

  1. La base : exécution en ligne de commande
  2. Alias
  3. Lancement programmé
  4. Arguments des tâches
  5. Options d’exécution
  6. Options d’exécution personnalisées

Exécuter des tâches

La base : exécution en ligne de commande

Grunt s’exécute en ligne de commande. Une fois le CLI installé, la commande grunt permet de lancer une séquence synchrone de tâches. Synchrone signifie qu’une tâche commence son exécution dès que la précédente tâche de la séquence s’est terminée. Ce mécanisme permet de contrôler l’ordre d’exécution.

$ grunt task1 task2 task3

Si vous lancez la commande grunt sans spécifier de tâche, c’est la tâche nommée default qui est exécutée. Cela revient donc à lancer une séquence d’une seule tâche default. Si aucune tâche default n’existe dans le Gruntfile, une exception est levée.

$ grunt
$ grunt default

Alias

La tâche default peut n’être qu’un alias pour une séquence de tâches. Cet alias vous sert donc de raccourci pour exécuter une séquence de tâches.

Une tâche alias s’écrit de la manière suivante :

grunt.registerTask(alias, description, sequence);

sequence est un tableau de noms de tâches à exécuter séquentiellement.

// exemple d'une tâche alias lançant séquentiellement les tâches task1 et task2
grunt.registerTask('alias', 'Description de la tâche "alias".', ['task1', 'task2']);

Lancement programmé

Un alias permet de lancer une séquence de tâches sans contrôle d’aucune sorte, si ce n’est qu’une tâche de la séquence ne peut s’exécuter que si la tâche précédente s’est terminée avec succès.

Si l’on veut aller plus loin, il est possible de créer une tâche qui lance d’autres tâches sans pour autant être un alias. Cela est utile si l’on veut, par exemple, ne pas lancer une tâche si une condition particulière n’est pas remplie ou en lancer une autre à la place. grunt.task.run permet cela.

module.exports = function(grunt) {

  grunt.registerTask('less', 'Compiles LESS to CSS.', function() {
    // ...
  });

  grunt.registerTask('minify', 'Minifies JavaScript & CSS files.', function() {
    // ...
  });

  grunt.registerTask('deployDfs', 'Deploys the Web site via the DFS.', function() {
    // ...
  });

  grunt.registerTask('deployFtp', 'Deploys the Web site via FTP.', function() {
    // ...
  });

  grunt.registerTask('customSequence', 'Does all the stuff.', function(build, mode){
    if (build==='true'){
      grunt.task.run('less');
      grunt.task.run('minify');
    }

    if (mode==="ftp"){
      grunt.task.run('deployFtp');
    }
    else if (mode==="dfs"){
      grunt.task.run('deployDfs');
    }
  });

}

grunt : grunt-task-run

Arguments des tâches

Les arguments d’une tâche sont passés en ligne de commande à la suite du nom de la tâche et séparés par un deux-points.

module.exports = function(grunt) {
  grunt.registerTask('task', 'Tâche avec arguments?', function() {
    grunt.log.writeln(this.args);
  });
}

grunt : task arguments

Pour les multitâches, il est obligatoire de spécifier la cible avant les arguments :

module.exports = function(grunt) {
  grunt.initConfig({
    multiTask: {
      target1: {
      },
      target2: {
      }
    }
  });

  grunt.registerMultiTask('multiTask', 'Tâche avec arguments?', function() {
    grunt.log.writeln("target : " + this.target);
    grunt.log.writeln("arguments : " + this.args);
  });
}

grunt : multitask arguments

Options d’exécution

Les options d’exécution sont passées à la fin de la ligne de commande et précédées d’au moins un tiret. Les noms des options sont sensibles à la casse.

Grunt fournit les options suivantes :

  • --help, -h : Affiche l’aide.
  • --base, -b : Spécifie un chemin de base alternatif. Par défaut, tous les chemins sont relatifs au Gruntfile. C’est une alternative à grunt.file.setBase(...)
  • --no-color : Désactive la coloration de la sortie de la commande grunt.
  • --gruntfile : Spécifie un Grunfile alternatif. Par défaut, grunt cherche le fichier Gruntfile.js ou Gruntfile.coffee le plus proche dans le répertoire courant, ou ses parents.
  • --debug, -d : Active le mode de débogage pour les tâches qui le supportent.
  • --stack : Affiche la stack trace en cas de warning ou d’erreur fatale.
  • --force, -f : Force l’exécution en cas de warning.
  • --tasks : Chemins additionnels à scanner pour rechercher des tâches. Alternative à grunt.loadTasks(...).
  • --npm : Plugins grunt installés avec npm à scanner pour rechercher des tâches. Alternative à grunt.loadTasks(...).
  • --no-write : Désactive l’écriture de fichiers (dry run).
  • --verbose, -v : Mode verbeux. Ajoute des informations en sortie.
  • --version, -V : Affiche la version de grunt. Combiner avec --verbose pour obtenir des informations supplémentaires.

Prenons en exemple l’option --help. En plus d’afficher de l’aide sur la commande grunt, cette option permet d’afficher la description des tâches contenues dans le Gruntfile et les fichiers JavaScript trouvés dans les répertoires scannés :

module.exports = function(grunt) {

  grunt.registerTask('less', 'Compiles LESS to CSS.', function() {
    // ...
  });

  grunt.registerTask('minify', 'Minifies JavaScript & CSS files.', function() {
    // ...
  });

  grunt.registerTask('deploy', 'Deploys the Web site.', function() {
    // ...
  });

  grunt.registerTask('all', 'Does all the stuff.', ['less', 'minify', 'deploy']);

}

grunt : task-help

Options d’exécution personnalisées

Il est possible de gérer ses propres options d’exécution. Leur valeur est récupérée via la méthode grunt.option.

module.exports = function(grunt) {
  console.log('log is: ' + grunt.option('log'));

  grunt.registerTask('task', function() {
    if (grunt.option('log')===true){
      console.log('just began');
    }

    // do some stuff

    if (grunt.option('log')===true){
       console.log('just finished');
    }
  });
}

grunt : runtime options

Si aucune valeur n’est spécifiée, la seule présence de l’option lui donne la valeur true. Pour lui donner une autre valeur, il suffit de spécifier la valeur après l’option dans la ligne de commande. Vous pouvez le faire en précédant la valeur d’un espace ou du signe =.

module.exports = function(grunt) {

  var logLevels = {
    verbose: 1,
    info: 2,
    warning: 3,
    error: 4
  }

  grunt.registerTask('task', function() {
    if (grunt.option('log')<=logLevels.verbose){
      console.log('just began');
    }

    try{
      throw new Error('I did bad stuff !');
    }
    catch(e){
      if (grunt.option('log')<=logLevels.error){
        console.log(e);
      }
    }
  });
}

grunt : runtime options (2)

Au fait, les options d’exécution personnalisées… A quoi ça sert ? Les exemples précédents vous orientent. Ça sert à modifier l’exécution de vos tâches de manière occasionnelle. Ici, on a activé des logs optionnels. En mode de fonctionnement normal, on ne va pas activer les logs en mode verbeux, mais plutôt en mode erreur. Plus généralement, la présence ou l’absence d’une option à l’exécution peut, par exemple, conditionner un mode d’exécution optimisé ou un mode debug.

Et après ?

Nous arrivons au bout de cette série d’articles consacrée au lanceur de tâches Grunt. Vous connaissez l’API Grunt et êtes à présent capables de créer, configurer et lancer des tâches.

Dans le dernier article de cette série, nous allons voir un cas pratique de projet utilisant des tâches Grunt : Twitter Bootstrap.

Nombre de vue : 193

AJOUTER UN COMMENTAIRE