In the previous post we have seen how to create your own yeoman generators using custom _.templateSettings rules.
However if you want to dive into yeoman generators you can play with generator-generator, have a look at the code of existing generators and... why not? Create your own whatever-you-want yeoman generator!
I chose to implement a simple generator, based on custom _.templateSettings seen in the previous post, that let you automate the mongodb installation.
Its name is generator-mongodb (https://github.com/davidemoro/generator-mongodb).
Useful or not useful, this is my first whatever-i-want-generator, made just for fun. There is no tests coverage (I got stuck on a problem but the solution is on his way) and I won't maintain it. So that's just an example, anyway I hope you'll find useful hints.
How it is implemented this generator under the hoodThis generator is internally based on the buildout build system (http://www.buildout.org).
What is buildout? Buildout is a widely Python-based build system for creating, assembling and deploying applications from multiple parts, some of which may be non-Python-based. It lets you create a buildout configuration and reproduce the same software later.
Don't worry: we are not going to write any line of python code! We need python because it is required by our install system).
Buildout configurations are text-based, versionable, fine-grained reproducible environments that you can share with your team or create software installers (one example is the Plone CMS unified installer - see http://plone.org/products/plone).
There are dozens of published buildout recipes ready to be used. For example:
- compiling and installing source distribution - https://pypi.python.org/pypi/hexagonit.recipe.cmmi
- generate a text file from a template based on configurable parameters-http://pypi.python.org/pypi/collective.recipe.template
- define maintenance cron jobs to be started periodically with no root privileges (normal users) - https://pypi.python.org/pypi/z3c.recipe.usercrontab
- downloading and installing MongoDB - https://pypi.python.org/pypi/rod.recipe.mongodb
This helps when introducing multiple developers to a project: you can reduce setup times and enhance productivity. This way we can ensure that the whole team we are collaborating with has the right environment and you can save a lot of time.
Another example: if you are the creator of a nice open source project (for example a Node.js CMS based on MongoDB), you shoud consider that your download&install page will be visited by people just interested in evaluating a CMS or specific app solution without any knowledge or interest about the technology involved because they want to install and play with it locally. So you can provide simpler install instructions thanks to buildout (or any other automated system), for example you can replace "be sure you have installed node.js version x.y.z and MongoDB" with "checkout this folder and run this command: done!".
If you don't provide similar easy way to install your solution you are assuming that your users are comfortable with the underlying technologies, they know how to install the external components you need to run your software. - If you want to explore a different approach you can have a look at http://www.vagrantup.com/ with its virtual environments.
Let's come back to the buildout. Buildout files can be extended, we can build different profiles (production, development, etc) and a very simple buildout.cfg file looks like the following:
[buildout]How it works? Just one command and the buildout process starts, for example:
parts = mongodb
recipe = rod.recipe.mongodb
darwin-32bit-url = http://downloads.mongodb.org/osx/mongodb-osx-i386-1.6.5.tgz
$ ./bin/buildout [-c buildout.cfg]So thanks to buildout and existing recipes our generator workflow will be very simple:
- read one or more user inputs (version of mongodb, but you can add more advanced options if you want)
- render the buildout.cfg following the steps described here http://davidemoro.blogspot.it/2014/03/yeoman-generator-template-settings-lodash-underscore-js.html
- setup the right environment (it creates a local and isolated python environment that does not pollute the global python installed on your system)
- runs the buildout command for you
For advanced option you can see the rod.recipe.mongodb reference: https://pypi.python.org/pypi/rod.recipe.mongodb.
How to use generator-mongodbBe sure you have installed node.js (see https://github.com/creationix/nvm), python and virtualenv (>= 1.11.4).
If you are not comfortable with python you can install it with a couple of commands:
$ sudo apt-get install python2.7The install yo:
$ sudo apt-get install python-pip
$ [update 20140410: not safe, follow the official doc]
sudo pip install --upgrade virtualenv
$ npm install -g yoIf generator-mongodb were released, installing it it would as simple as typing:
$ npm install -g generator-mongodbSince this package is not released, you'll have to clone the github repository:
$ git clone email@example.com:davidemoro/generator-mongodb.gitThen move where you want to install your local mongodb environment and type:
$ cd generator-mongodb
$ npm install
$ npm link
$ mkdir yourmongodirAnd you'll see something of similar.
$ cd yourmongodir
$ yo mongodb
Type the mongodb version and wait for the end of the install process (it might take a while).
Once finished you'll find the mongodb executables:
$ ls bin -1 | grep mongoUpdate 20140415: actually ./bin/mongod doesn't work because I missed to set the db path option in buildout.cfg. Just type mkdir -p data/db in your buildout root and launch ./bin/mongod --dbpath data/db. If you configure well the mongodb recipe it will work without typing any option.