Faites vos outils avec npm et node

Lorsque je code, j’ai souvent des tĂąches rĂ©pĂ©titives (quel que soit le langage), ie:

  • Ă©crire des modĂšles et des collections Backbone
  • Ă©crire des modĂšles Play
  • Ă©crire des routes pour Express.js
  • 


Nul doute, que vous avez Ă©normĂ©ment d’autres exemples en tĂȘte. L’outil du moment pour rĂ©gler ce type de problĂšme est Yeoman (oui il y en a d’autres, mais Yeoman c’est “hype” ;)) et ensuite, ou vous avez de la chance, ou il faut Ă©crire le plugin dont vous avez besoin. Dans certains cas, surtout si vous n’avez pas besoin de quelque chose de complexe, vous pouvez rapidement Ă©crire un utilitaire avec uniquemnt node et npm.

Spécifications (par exemple)

Je passe mon temps Ă  Ă©crire des modĂšles et des collections Backbone qui ressemblent Ă  ceci :

/*--- Human Model ---*/
var HumanModel = Backbone.Model.extend({
    defaults : function (){
      return {}
    },
    urlRoot : "humans"
});

/*--- Humans Collection ---*/
var HumansCollection = Backbone.Collection.extend({
  url : "humans",
  model: HumanModel
});

Et j’aimerais aller plus vite, juste taper bb Human et obtenir mon fichier gĂ©nĂ©rĂ©.

Juste fais-le 


package.json

Commencez par créer un répertoire bbtools. Ensuite dans ce répertoire, créez un fichier package.json avec le contenu suivant :

{
 "name": "bbtools",
 "version": "0.0.0",
 "bin": { "bb": "bb.js"},
 "dependencies": {
   "underscore": "1.6.0"
  }
}

L’objectif Ă©tant de disposer d’une commande bb qui exĂ©cutera le fichier bb.js. Notez "underscore": "1.6.0", nous allons nous servir des capacitĂ©s de “templating” de la librairie Underscore

Notre template

CrĂ©ez (dans le mĂȘme rĂ©pertoire) un fichier bb.tpl avec le contenu suivant :

/*--- <%= modelName %> Model ---*/
var <%= modelName %>Model = Backbone.Model.extend({
    defaults : function (){
      return {}
    },
    urlRoot : "<%= modelName.toLowerCase() %>s"
});

/*--- <%= modelName %>s Collection ---*/
var <%= modelName %>sCollection = Backbone.Collection.extend({
  url : "<%= modelName.toLowerCase() %>s",
  model: <%= modelName %>Model
});

Le code applicatif

CrĂ©ez (dans le mĂȘme rĂ©pertoire) un fichier bb.js avec le contenu suivant :

# !/usr/bin/env node

var fs = require('fs');
var _ = require('underscore');

require.extensions['.tpl'] = function (module, filename) {
  module.exports = fs.readFileSync(filename, 'utf8');
};

var tpl  = _.template(require("./bb.tpl"));
var model_name = process.argv[2]

fs.writeFileSync(
    process.cwd() +"/" + model_name + ".js"
  , tpl({modelName :model_name})
);

# Explications

  • # !/usr/bin/env node : rendra le fichier exĂ©cutable
  • _.template(require("./bb.tpl")) va lire notre fichier bb.tpl et le transforme en objet template pour Underscore
  • process.cwd() permet de connaĂźtre le rĂ©pertoire d’oĂč l’on appelle la commande bb
  • process.argv[2] permet d’obtenir le 1er argument passĂ© Ă  la commande bb (comme par exemple bb Human)
  • tpl({modelName :model_name }) : on “explique” au template que l’on passe le contenu de model_name Ă  modelName dĂ©finie dans le template

Enregistrez votre outil

Pour que votre nouvelle commande soit disponible “partout” (pouvoir l’appeler de n’importe quel rĂ©pertoire), tapez la commande suivante (on est toujours dans notre rĂ©pertoire de dĂ©veloppement) :

npm link

Si ce n’est pas dĂ©jĂ  fait, cela va tĂ©lĂ©charger les dĂ©pendances nĂ©cessaires (underscrore dans notre cas), puis crĂ©er un “lien symbolique” vers votre fichier bb.js

Maintenant, de n’importe oĂč, dans une console (terminal), vous pouvez taper bb Animal et cela vous gĂ©nĂšrera votre fichier Animal.js avec votre modĂšle et votre collection.

VoilĂ , c’est trĂšs simple et utile. Si vous sentez que votre outil devient une usine Ă  gaz, passez quand mĂȘme Ă  Yeoman ;).

blog comments powered by Disqus

Related posts