mercredi 27 avril 2016

Yeoman : Passing data from generator to sub generator

I won't present Yeoman here. If you like to use scaffolding tool and use JavaScript, you already have heard about this great tool.

Maybe you've even tried to write your own generator. If you did, sooner or later you'll want to structure your code using sub generators and pass data from your (main) generator to your sub generators.

This simple task took me more time than needed, mainly because I was unable to find the right documentation.
The official documentation on the topic suggest using composeWith() with the options parameter to pass data to the called generator, but doesn't show how to get the data in the called generator.

So in hope the following could help others, you'll find below an example of how to do it.

In the generator you call the sub-generators this way :
//in generator-arhuman/generators/app/index.js 
this.composeWith('arhuman:express', { options: { my_opt: 'anystring' } }, { local: require.resolve('../express') });

Note the second parameter, the options object described in the documentation.
Now in the called sub-generator you get the data in the constructor by defining an option:

//in generator-arhuman/generators/app/express/index.js
module.exports = yeoman.generators.Base.extend({ 
  constructor: function () { 
      yeoman.generators.Base.apply(this, arguments); 
      
      // This option will get the value passed by the caller generator
      this.option('my_opt', { 
            type: String, 
            required: true, 
            desc: 'My option' 
          }); 
    }, 
  
  // Writing Logic here 
  writing: { 
    // Copy the configuration files 
    config: function() { 
      this.fs.copyTpl( 
        this.templatePath('_package.json'), 
        this.destinationPath('package.json'), { 
          name: this.options.my_opt
        } 
      ); 
     // ...
      ); 
    }, 

  install: function () {
    this.installDependencies();
  }
});

By giving it the same name as the key in the options object used in the composeWith() call you will get the value from the caller generator and use it later through this.options.my_opt

samedi 23 janvier 2016

Installation locale de nodejs et npm


Pour mes environnements de développement je suis un fan des environnements locaux
(perlbrew/plenv, virtualenv...) :
_  Pour séparer mon environement de développement du sytème
_  Pour se dispenser du sudo
_  Parce que ça donne une meilleur visibilité sur l'environnement de dev qui est ainsi mieux contenu/localisé.

C'est pourquoi comme je vais désormais utiliser assez souvent node et npm, je préfère le mode d'installation suivant à celle classique des paquets sur ma Debian.

# Installation des prérequis (optionnel)
sudo apt-get install build-essential curl

# Ajout d'un répertoire au PATH
mkdir ~/local
echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc

 # Installation de node via les sources
mkdir ~/node-install
cd ~/node-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install
cd ..
rm -rf  ~/node-install

#Installation de npm
curl https://www.npmjs.com/install.sh | sh
 

jeudi 7 janvier 2016

Année de Javascript

Parmi mes résolutions de début d'année l'étude approfondie de Javascript et de son écosystème tient une place de choix.

Pourquoi Javascript ? Alors que Perl 6 est là ? Que des langages plus récents comme nimrod, go, rust ont vent en poupe ? Que des langages offrant d'autres paradigmes comme haskell, clojure seraient plus dépaysant ? Pourquoi Javascript en 2016 ?!?

Pour moi les principales raisons sont :
_ La souplesse du langage (je retrouve pas mal de choses que j'aime avec Perl)
_ L'asynchronisme dans son "adn"
_ La maturité de l'écosystème nodejs (npm !)
_ La possibilité d'utiliser le langage partout (serveur, navigateur, ligne de commande, embarqué...)
   (et pour *tous* les projets qui me trottent dans la tête)
_ Le moment me semble idéal  (ES6, Angular 2 béta, Année du singe ;-) )


J'ai déjà conscience que tout n'est pas rose (callbacks hell, le rythme de sortie et d'obsolescence des frameworks/libraries qui est dément...) et j'espère bien découvrir d'autres zones de frictions mais c'est décidé en 2016 tous mes projets persos se feront en Javascript.