Nous avons vu dans l’article précédent Grunt: l’automatisation facile (part 1) comment installer et configurer Grunt. Nous allons dans aujourd’hui utiliser des plugins pour aller plus loin et créer nos propres tâches.
tous les codes source de cet article sont disponibles sous github
Les plugins
Grunt est bien supporté par la communauté, et la multitude de plugins disponibles pourront vous rendre de grands services.
Quelques exemples parmi les plus connus:
- grunt-contrib-watch : permet de surveiller une arborescence de fichier de de déclencher des actions en cas de modification de l’un d’eux (voir exemples ci-dessous)
- grunt-contrib-copy : comme le nom l’indique, permet de copier des fichiers d’un répertoire A à un répertoire B
- grunt-contrib-concat : concatène plusieurs fichiers en un seul
- grunt-contrib-uglify : “minifie” des fichiers en utilisant la librairie UglifyJS
- grunt-contrib-jshint : linter javascript utilisant la librairie JSHint (voir exemple plus bas)
- grunt-shell : permet de définir des tâches custom utilisant le shell (voir exemple plus bas)
Pour aller plus loin …
Pour ceux qui souhaitent approfondir un peu, vous trouverez ci-dessous quelques exemples complémentaires et un paragraphe sur l’utilisation de tâches personnalisées.
Quelques exemples d’utilisation des plugins
grunt-contrib-jshint
JSHint permet de détecter dans le code javascript des erreurs de syntaxe simples (oubli d’un ‘;’ à la fin d’une ligne, oubli d’une accolade à la fin d’un bloc, utilisation de noms de variable non conforme, …)
Il s’installe de la manière suivante:
1
|
|
Et il se configure dans le Gruntfile suivant l’exemple ci-dessous, qui va vérifier le fichier Gruntfile.js
lui-même, et tous les fichiers javascript se trouvant dans le répertoire js
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Puis il vous suffit d’exécuter la commande grunt
:
1 2 3 4 5 |
|
On voit que le fichier Gruntfile.js
a été vérifié avec succès.
grunt-contrib-watch
Le plugin watch permet de déclencher des tâche lorsque des fichiers sont modifiés.
Il s’installe de la manière suivante:
1
|
|
Et il se configure dans le Gruntfile suivant l’exemple ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
On en profite pour ajouter 2 hash qui permettront ensuite de gagner du temps: dirs
et files
et qui définissent les répertoires et catégories de fichiers qui seront utilisés ensuite dans les tâches.
Vous retrouvez les 2 lignes qui chargent le plugin (grunt.loadNpmTasks(‘grunt-contrib-watch’);
) et enregistrent votre tâche (grunt.registerTask(‘default’, [‘watch:jshint’]);
)
La configuration du pluging comporte une section qui défini la tâche à lancer jshint
et quels sont les fichiers à surveiller.
Dans notre cas, nous allons linter tous les fichiers js qui se trouvent dans les répertoires js
et public
, ainsi que le fichier Gruntfile.js
.
Il ne reste plus qu’à exécuter la tâche :
1 2 3 |
|
Encore un petit truc, si vous n’avez pas enregistré de tâche personnelles avec la propriété registerTask
, vous pouvez toujours exécuter les tâches définies dans le initConfig()
.
Il ne nous reste plus qu’à provoquer un changement dans le fichier Gruntfile.js
en supprimant un point-virgule en fin de ligne par exemple (ne pas oublier de sauver le fichier)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Si on corrige l’erreur:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
Ouf, la catastrophe est évitée.
grunt-shell
Le dernier plugin que nous allons étudier est le plugin grunt-shell
.
Ce plugin permet d’exécuter des commandes système dans grunt.
Dans notre exemple, nous allons créer une tâche qui réalise une commande git log
.
On pourra plus tard, réaliser un “rsync” pour déployer son application sur un serveur de préproduction.
Vous connaissez la manipulation, on commence par installer le plugin:
1
|
|
Et on le configure dans le Gruntfile suivant l’exemple ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
La section de configuration de la tâche logShell
) et d’activer les sorties standards stdout et stderr.
Les sous-sections suivantes définissent les appels systèmes.
Essayons :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
On est bien d’accord que c’est juste un exemple, et que cette tâche ne présente aucun intérêt pratique, il serait évidemment plus simple d’entrer la commande % git log
…
Créer ses propres tâches
La documentation grunt détaille la manière de créer ses propres tâches.
Tâches personnalisées simples
Le plus simple pour créer une tâche est de la développer directement dans le Gruntfile :
1 2 3 |
|
Puis appelez la directement :
1 2 3 4 5 |
|
C’est relativement pratique pour les scripts simple. Pour développer des tâches plus complexes, voici comment procéder.
Tâches personnalisées complexes
Les tâches personnalisées sont stockées dans un répertoire qui peut être chargé par grunt. Dans notre cas, nosu avons créé une tâche hash
(merci @jinroh) qui calcul un hash md5 sur des fichiers.
On modifie les Gruntfile comme suit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
Puis on crée un répertoire tasks
contenant un fichiers hash.js
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
Il ne reste plus qu’à lancer la tâche :
1 2 3 4 5 6 7 |
|
Conditions d’échec
Il faut noter que lorsqu’on défini une tâche comme une suite d’autres tâches, toute erreur sur une de ces tâches provoque l’arrêt de la tâche ‘parente’.
Par exemple l’exécution de la suite de tâche ci-dessous va échouer lors de la 2ème tâche (ko2) sans exécuter la 3ème (ok3) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 |
|
Liens pour aller (encore) plus loin
- Advanced Grunt Tooling
- Perfecting your Grunt Workflow
- Grunt with express server and Livereload : pour servir votre site en local et rafraîchir votre navigateur dès que le code change
Conclusion
Je vous conseille de jeter un oeil aux plugins qui permettent d’intégrer les framework de test dans grunt (grunt-mocha par exemple) et qui permettent d’aller très loin dans l’automatisation des tâches (corvées ?) courantes. Vous pouvez aussi examiner le module grunt-init qui permet d’initialiser des projets rapidement suivant des TEMPLATES prédéterminés.
La communauté est très active autour de ce projet, vous trouverez surement le plugin qu’il vous faut !
Enfin, pour supporter Grunt, vous pouvez d’ailleurs ajouter aux README.md
de vos propres projets, la ligne
1
|
|
Ce qui fera apparaître le badge suivant :