Grunt (5) : Exécuter des tâches
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 :
- Découvrir Grunt dans son ensemble
- Avoir un aperçu de l’API Grunt basée sur celle de node.js
- Comprendre comment configurer les tâches Grunt
- 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.
- La base : exécution en ligne de commande
- Alias
- Lancement programmé
- Arguments des tâches
- Options d’exécution
- 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);
où 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');
}
});
}
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);
});
}
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);
});
}
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 commandegrunt
.--gruntfile
: Spécifie un Grunfile alternatif. Par défaut, grunt cherche le fichierGruntfile.js
ouGruntfile.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']);
}
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');
}
});
}
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);
}
}
});
}
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.