Most Gemfiles I see are either unordered (just throw new gems in, wherever!) or alphabetically ordered. A while back, I reordered the Sifter Gemfile, ordering by difficulty of removing the dependency and grouping by functional area. Thus organized, it came out a bit like this:
- Framework: Rails, Rack, the mysql2 driver, JSON, Rake. We will basically use these forever.
- Gems for our vendors: Postmark, Braintree, Skylight, Bugsnag. We’ll use these as long as we’re using their respective service.
- Partner integratons: GitHub, OmniAuth, etc. Most of these aren’t maintained by the partner, and we’d have to drop the integration to drop the gem.
- Extensions: jquery-rails, delayed-job, will_paginate, etc. We could stop using these if we cared a lot, but we’re pretty committed to them.
- File uploading: carrierwave, fog, wand, rmagick. We’d have to overhaul our file attachment support if we wanted to remove these.
- Sphinx support: thinking-sphinx and ts-delayed-delta. We’d have to overhaul our search to remove these.
- Admin: bootstrap, etc. Things we could easily remove next time we overhaul our admin, which isn’t really a big deal if we decide to.
- Gems for building assets: jquery-ui-rails, therubyracer, execjs, coffee-rails, sass, compass, etc. We’d have to remove uses of the underlying tool (CoffeeScript, SCSS, etc.) if we wanted to drop one of these.
- Development gems: pry, ffaker, byebug, better_errors, spring, rack-mini-profiler. We can switch these out if we want.
- Testing gems: rspec-rails, capybara, etc. Again, if we change tools we can change these.
- Deployment: capistrano. This could go in the framework section, seems unlikely we’d overhaul our deploy scripts away from Capistrano.
This organization makes it easy to know where to add a new dependency. More importantly, we can better understand how much we depend on a gem and the level of effort to remove it if we need to.