I had some gems that I only needed for development on my mac, and did not want them to be installed to my Heroku slug. I didn’t want them installed because they would break the deployment.
Everything was fine until I wanted to use autotest with my Rails 3 app that is hosted on Heroku. I got this error when I tried to deploy:
ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError) /usr/ruby1.9.1/bin/ruby extconf.rb extconf.rb:19:in `<main>': Only Darwin (Mac OS X) systems are supported (RuntimeError) Gem files will remain installed in /disk1/tmp/12479_23567910067960/.bundle/gems/gems/autotest-fsevent-0.2.2 for inspection.
As they call out in their documentation, “Heroku does not specify any groups during bundle installation, so all gems from all groups will be bundled with your application.” I needed to find a way to exclude some libraries from being installed.
Based on a tip from the Heroku mailing list I found that the following worked:
gem "autotest-fsevent" if RUBY_PLATFORM =~ /darwin/
But if I was going to exclude one gem, I figured I could exclude all my development gems, so I wound up doing this:
if RUBY_PLATFORM =~ /darwin/ group :test do gem "rspec-rails", ">= 2.0.0.beta.8" gem 'factory_girl', :git => 'git://github.com/thoughtbot/factory_girl.git', :branch => 'rails3' gem 'autotest-rails' gem 'autotest' gem 'autotest-fsevent' gem 'autotest-growl' end end
So I made that change, and deployment was still failing. I removed my Gemfile.lock and everything worked.
This presents a complication, which according to Yehuda, “because gems no longer live in your application, we needed a way to snapshot the list of all versions of all gems used at a particular time, to ensure consistent versions across machines and across deployments.”
To work around this I am specifying exact versions of the gems in my Gemfile.
Of course if Heroku added support for
bundle install --without test, everything would work just as it should™.
Added Bonus: My compiled slug size went from 19.6MB to 5.1MB.