Cette section de notre site s'adresse aux développeurs web et aux intégrateurs. Nous partageons dans ces pages avec un public spécialisé notre expérience (et nos expériences) dans toutes les domaines de la programmation web.
Tutoriel Nanoc : Un compilateur de sites internet statiques (1/3)
1 Introduction
Il est vrai que les sites statiques se font rares. Pas la moindre page web, semble-t-il, dont le contenu ne soit discrètement soufflé par une base de données, et l'on aura beau jeu de déclarer leur temps achevé. C'est aller un peu vite en besogne, au regard du double coût que présentent les sites dynamiques:
- En ressources, d'abord, qu'un système de cache efficace peut néanmoins alléger, au prix d'une plus grande complexité.
- En sécurité, tout code exécuté dynamiquement prêtant le flanc aux attaques, dont le risque impose d'infinies précautions au programmeur et à l'administrateur système.
C'est, pour bon nombre de sites, un mal nécessaire. Mais pas pour tous.
En effet, le caractère dynamique d'un site n'a parfois pour seule raison d'être que de simplifier la vie du webmaster. C'est notamment le cas lorsque le contenu est essentiellement statique, édité via une interface en ligne, et qu'aucune interaction n'est prévue avec les visiteurs du site, comme un système de commentaires ou un forum.
Il est alors possible de générer ce contenu sur l'ordinateur du webmaster au moyen d'un compilateur de site tel que Nanoc, sans aucun travail de la part du serveur, contournant ainsi les deux inconvénients mentionnés plus haut. Nous verrons d'ailleurs que la flexibilité d'un tel outil justifierait sans eux son utilisation.
Nanoc étant un outil en ligne de commande écrit et extensible en Ruby, cet article présuppose une certaine familiarité avec:
- Le langage Ruby.
- L'utilisation de la console sous Linux / Mac OS X.
2 Installation de Nanoc
Comme pour beaucoup de logiciels et librairies Ruby, la méthode d'installation la plus simple reste le gestionnaire de paquet RubyGems:
La commande suivante permettra néanmoins aux jedis, aux inconscients et aux curieux d'en récupérer la dernière version depuis le dépôt officiel:
Si l'une ou l'autre de ces méthodes échoue, c'est sans doute que le logiciel nécessaire (RubyGems ou git) vous fait défaut.
3 Nanoc: Concepts et définitions
3.1 Structure d'un site Nanoc
Un site internet Nanoc est représenté par un répertoire doté d'une certaine structure. La commande nanoc create_site permet de créer le squelette d'un projet:
Nous reviendrons en détail sur la nature et la fonction de chacun de ces fichiers et répertoires. Comme je vous sais impatient, en voici un survol:
- config.yaml: définit les sources de données du site (système de fichiers, delicious, twitter), les emplacements (comme le répertoire de sortie), l'adresse du site (utilisée par certains plugins), etc.
- Rakefile: permet d'automatiser certaines tâches avec 'rake', équivalent Ruby de 'make'. Nous ne nous en occuperons pas.
-
Rules instruit Nanoc sur:
- la méthode de compilation à employer pour chaque élément (compilation).
- le fichier de destination (routage).
- content/: les éléments à compiler (ou si vous préférez, le "code source").
- layouts/: les layouts disponibles.
À ce stade, il est essentiel de définir la notion clé de Nanoc, celle d'élément (ou en anglais, item).
3.2 La notion d'élément
Dans Nanoc, l'objet central n'est pas la page, mais l'élément. Un élément est conceptuellement un ensemble de données susceptibles de posséder plusieurs représentations. Dans un blog par exemple, la liste des articles peut être vue comme un élément, car elle est souvent proposée simultanément:
- En HTML, pour visualisation dans un navigateur Web.
- En XML, au format Atom ou RSS, pour consultation dans un agrégateur.
Ce qui signale à Nanoc l'existence d'un élément, c'est la présence dans le répertoire content/ d'un fichier de métadonnées, ou attributs, au format YAML. Ce fichier peut très bien être vide mais je vous conseille d'y définir toutes sortes de données pouvant servir à générer le résultat final, comme le titre, l'auteur, la liste des mots-clés, etc.
Chaque élément possède un identifiant (identifier) unique qui le caractérise lors du processus de compilation. L'identifiant d'un élément découle naturellement de l'emplacement du fichier YAML correspondant dans le répertoire content/. Donnons quelques exemples de cette transformation desquels la règle générale apparaîtra clairement:
| Emplacement | Identifiant |
|---|---|
| content/index.yaml | / |
| content/contact.yaml | /contact/ |
| content/notre-entreprise.yaml | /notre-entreprise/ |
| content/blog.yaml | /blog/ |
| content/blog/2005.yaml | /blog/2005/ |
Pour éviter toute confusion, remarquons tout de même que:
- Le fichier content/index.yaml définit l'élément /, et non l'élément /index/, ce qui constitue l'unique exception à la règle générale.
- L'identifiant se termine toujours par /, comme un chemin de répertoire.
Les diverses représentations d'un élément, enfin, sont figurées par autant de fichiers de même nom et de même emplacement que la liste des attributs, exceptée l'extension. Aussi, et pour reprendre notre exemple initial du blog, à l'élément /blog/ défini par le fichier content/blog.yaml pourront être attachées les représentations content/blog.html et content/blog.xml.
Notons enfin, comme nous le verrons dans une prochaine partie, que l'identifiant d'un élément n'équivaut nullement à son emplacement final, bien qu'il s'agisse du comportement par défaut. Le routage, que nous étudierons alors, offre à ce sujet une totale liberté.
2.3 Layouts
Les pages d'un même site possèdent presque toujours une structure commune. La notion de layout, qui n'est pas propre à Nanoc, permet de factoriser cette structure, évitant ainsi la redondance et facilitant la propagation des changements. Nous étudierons les layouts dans la prochaine partie.
2.4 Compilation et auto-compilation
Avant de mettre en ligne un site internet Nanoc, il convient de le compiler:
Le répertoire output/ est alors créé ou mis à jour automatiquement.
En phase de développement, plutôt que de recompiler en permanence votre projet pour visualiser les changements, vous souhaiterez sans doute utiliser l'auto-compilateur. Il s'agit en fait d'un serveur HTTP chargé de créer à la volée les fichiers demandés. La commande suivante permet d'en démarrer l'exécution:
Pour voir votre site internet, il suffit alors de visiter la page: http://localhost:3000/. Enthousiasmant, non ?
L'auto-compilateur écoute par défaut sur le port TCP 3000, mais il est toujours possible de lui en assigner un autre:
Dans les prochaines parties de notre tutorial, nous supposerons que votre autocompilateur est en écoute sur le port 3000.
Un dernier conseil concernant l'auto-compilation: n'oubliez pas que les éléments ne sont créés qu'en cas de nécessité: il est donc prudent, avant de publier votre site, de procéder à une compilation manuelle, afin de ne rien oublier !
3 La prochaine fois...
Nous n'avons fait qu'effleurer la surface de Nanoc: vous brûlez sans doute d'en découvrir plus. Patience !
Dans la deuxième partie de ce tutoriel, nous manipulerons pages, éléments et layouts. Nous montrerons comment les métadonnées et le plugin Nanoc3::Helpers::Capturing permettent de créer des layouts vraiment flexibles.
Dans une troisième partie, nous lèverons le voile sur les règles de routage et de compilation, nous présenterons les filtres et explorerons un autre plugin bien utile: Nanoc3::Helpers::XMLSitemap.
Il sera alors temps de vous laisser faire vos armes par vous-mêmes... et expérimenter pour découvrir toute la puissance de Nanoc.