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 fichierbb.tplet le transforme en objet template pour Underscoreprocess.cwd()permet de connaĂźtre le rĂ©pertoire dâoĂč lâon appelle la commandebbprocess.argv[2]permet dâobtenir le 1er argument passĂ© Ă la commandebb(comme par exemplebb Human)tpl({modelName :model_name }): on âexpliqueâ au template que lâon passe le contenu demodel_nameĂmodelNamedĂ©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 ;).
Tweet