Aside from being a top end legal team, Yeoman, Grunt, and Bower are also the names of some front-end development tools I use when working on new projects these days or whenever it’s going to be easier to throw together some code and test it out in a testbed rather than embedded in a larger project. First I’ll go over what role each of these has in the development of a modern website front-end. Then I’ll take a brief side trip into a tool (Node.js) which isn’t directly relevant to any of them, but one which is required in order to install them. Then we’ll get into some specifics for all three as I demonstrate using them to get started on an AngularJS project.
Yeoman is the code generator, it fulfills a role similar to that filled by the Rails app if you’ve ever used Ruby on Rails because it can be used to generate whole projects or individual pieces of code depending upon the specific code generators it has installed. It gives you a quick shell from which to start a project.
That side trip I mentioned
As I mentioned earlier, you use the npm tool you just installed to install the other three by running “npm install -g yo” (the details are covered on Yeoman’s website: http://yeoman.io/ but that’s actually all you have to do). You’ll see npm download, compile, and install tons of stuff but you won’t actually be involved in the process. In that respect it’s much like other package managers like Yum or RPM.
Finally you’ll need some kind of Yeoman generator installed in order in order to generate our starting shell: “npm install -g generator-angular”
With all the installation out of the way, let’s create a directory for a new project (“mkdir TestApp”), change directory into the newly created directory, and just type “yo” at the command line and see what we see.
Pick “Run the Angular generator” and hit enter, then answer the various yes or no questions it asks in order to generate the shell you want for your app. At the end it will also run npm to install the local copies of tools you may need and Bower to install the various libraries you need for your shell (for example, AngularJS and jQuery).
Yeoman has now fulfilled most of its mission but I want to look at some files it generated and then come back to using it as a tool even after we have our shell. There are many files worth noting which Yeoman generated but three in particular are:
- package.json – This file tells npm which Node.js packages need to be installed in this particular project. Most of what you’ll find in here are packages Grunt needs to do its job. Rather than installing these globally, they are instead installed on a project by project basis so you can have different versions of the tools used by different projects.
- Gruntfile.js – This file is task instructions for Grunt so it knows how to perform a set of different tasks for a given project. If you look near the bottom of the file you’ll see that the Angular generator has created a file with the tasks “server”, “test”, and “build” which in turn call many other sub-tasks to perform their work.
Finally it’s worth noting that that’s not the final use that Yeoman can have in our development. Just as a Rails user can continue to use the Rails command to generate new models, migrations, etc. within an already constructed project, the Angular generator can be used to generate services, routes, directives, filters, etc. as detailed here: https://github.com/yeoman/generator-angular
At this point you would be forgiven for thinking that there was little point in installing Node.js except that it gave us the npm tool we needed to install all our other software, but actually Node.js is also being used behind the scenes by Grunt to run the local server I mentioned above.
Last but not least is Bower. It offers the opportunity to search for packages you may need in your project (for example, “bower search underscore” to find Underscore.js) and install them in your project (for example, “bower install –save underscore” to install the aforementioned package and add it to the list of dependencies in the bower.json file). Bower is also capable of understanding the difference between packages needed for development (for example, unit testing tools) and those needed for both development and runtime.
Since the .gitignore for the project will normally list both the app/bower_components and the node_packages directory, you won’t be checking in those pieces with your code (assuming you use Git as a version control mechanism). Instead, whenever checking out the project onto a new machine, just run “npm install” and “bower install” within the project directory and the tools will use the package.json and bower.json files to make sure all the needed pieces are installed.
But that’s not all
Keeping these tools up-to-date might prove difficult if not for the fact that the Node Package Manager is capable of doing so automatically via “npm update -g” for all your global software like Yeoman, Bower, etc. or “npm update” within the project directory to update Grunt packages, etc. I’m not going to contend that it always goes flawlessly, lots of this software is still beta and undergoing lots of changes so there have been days when I needed to remove it all and reinstall; but that’s rare and usually takes only a few minutes.