Gems On Rails
aka ‘vendor everything’
Link or freeze RubyGems into your rails apps, instead of just plugins. This allows you to ‘vendor everything’ – pushing all dependent gems into your rails app thus ensuring your application will be guaranteed to work when deployed. Your application is no longer dependent on the gems that are/aren’t available on your target deployment environment.
Installation and The Basics
First you install the gem:
$ sudo gem install gemsonrails
Then you deploy the gem into your target Rails application:
$ cd rails_app_folder $ gemsonrails
This installs some rake tasks into your app to help you freeze or link gems:
$ rake -T | grep "gems:" rake gems:freeze # Freeze a RubyGem into this Rails application; init.rb will be loaded on startup. rake gems:link # Link a RubyGem into this Rails application; init.rb will be loaded on startup. rake gems:unfreeze # Unfreeze/unlink a RubyGem from this Rails application
Finally, for each gem your application uses you can either freeze a version into the app (only for gems that do not require native compilation), or link a gem with your app (useful for gems that require native compilation)
$ rake gems:freeze GEM=map_by_method Unpacked map_by_method 0.6.0 to 'map_by_method-0.6.0' $ ls vendor/gems/map_by_method-0.6.0/ CHANGELOG README Rakefile init.rb lib test $ cat vendor/gems/map_by_method-0.6.0/init.rb require File.join(File.dirname(__FILE__), 'lib', 'map_by_method')
Restricting which environments a gem is loaded into
You can restrict which RAILS_ENVs the gem will be loaded for, using ONLY; e.g.
$ rake gems:freeze GEM=<gemname> ONLY=development $ rake gems:link GEM=<gemname> ONLY=production,staging
In the former, only in development mode will the gem be loaded. In the latter, only in production or staging mode will the gem be loaded from the deployment gem server
Upgrading from old GemsOnRails versions
All the freezing and linking functionality is in the plugin installed by the
gemsonrails command. To upgrade, simple install the new gem version, and re-run the
gemsonrails command. You application will now have the newest rake tasks and functionality.
How to submit patches
This code is free to use under the terms of the MIT licence.
Comments are welcome. Send an email to Dr Nic Williams.