5

I started using bundler and have some problems getting it working. I have the following gemfile:

source "http://rubygems.org"
gem "rack", "~>1.1"
gem 'pg','>= 0.8.0'
gem 'rails','2.3.8'
gem 'authlogic','2.1.3'
gem 'ajaxful_rating','2.2.3'
gem 'will_paginate','2.3.12'
gem 'right_aws','1.10.0'
gem 'aws-s3','0.6.2'
gem 'declarative_authorization','0.4.1'
gem 'timeline_fu','0.3.0'
gem 'friendly_id','>= 3.1'

Notice that I specificy that I want to use rack 1.1 (1.1.0).

I get the following error when I run with thin (Webrick works fine):

thin start
>> Using rails adapter
/usr/lib/ruby/gems/1.8/gems/bundler-1.0.3/lib/bundler/runtime.rb:27:in `setup': You have already activated rack 1.2.1, but your Gemfile requires rack 1.1.0. Consider using bundle exec. (Gem::LoadError)
 from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.3/lib/bundler/spec_set.rb:12:in `each'
 from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.3/lib/bundler/spec_set.rb:12:in `each'
 from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.3/lib/bundler/runtime.rb:17:in `setup'
 from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.3/lib/bundler.rb:100:in `setup'
 from /home/vmplanet/Documents/maga/config/../config/preinitializer.rb:16
 from /home/vmplanet/Documents/maga/config/boot.rb:28:in `load'
 from /home/vmplanet/Documents/maga/config/boot.rb:28:in `preinitialize'
 from /home/vmplanet/Documents/maga/config/boot.rb:10:in `boot!'
 from /home/vmplanet/Documents/maga/config/boot.rb:126
 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
 from /home/vmplanet/Documents/maga/config/environment.rb:7
 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/rack/adapter/rails.rb:42:in `load_application'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/rack/adapter/rails.rb:23:in `initialize'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/rack/adapter/loader.rb:48:in `new'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/rack/adapter/loader.rb:48:in `for'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/thin/controllers/controller.rb:163:in `load_adapter'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/thin/controllers/controller.rb:67:in `start'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/thin/runner.rb:177:in `send'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/thin/runner.rb:177:in `run_command'
 from /home/vmplanet/.gem/ruby/1.8/gems/thin-1.2.7/lib/thin/runner.rb:143:in `run!'

So basically it is complaining that I am using rack 1.2.1 (which is not the case, I can't think of anything using it).

Any thoughts?

Holger Just
  • 52,918
  • 14
  • 115
  • 123
user296489
  • 83
  • 1
  • 5

4 Answers4

6

Thin itself depends on Rack. And because Thin will load itself before it loads your application, the most recent version of Rack will already be loaded when bundler first enters the picture.

You have to force the correct version of Rack to Thin. In theory you could only have Rack 1.1.0 in your system gems, but that's hardly maintainable or portable. The error message already contains the answer; use bundle exec.

bundle exec thin start
molf
  • 73,644
  • 13
  • 135
  • 118
  • I can't help you with Heroku, perhaps their bundler documentation will help: http://docs.heroku.com/bundler – molf Oct 24 '10 at 13:06
  • 2
    I don't understand why rack 1.2.1 is being used as default. Isn't the whole point of bundler to tell what versions of gems should be used? I understand that there should be some initial load of rack, but why not have an auto reload to rack 1.1.0 if that's what is defined. – user296489 Oct 24 '10 at 16:58
  • 1
    There's no way to unload a gem; so if Bundler isn't loaded first, there's no way it can fix the version mismatch. The solution is `bundle exec`, and this is exactly the reason for its existence. – molf Oct 25 '10 at 11:47
  • Thanks Molf, I understand, basically the issue for me now is to find out how to get this working on Heroku. I can't find how to issue the command on Heroku. – user296489 Oct 25 '10 at 13:40
2

So basically it is complaining that I am using rack 1.2.1 (which is not the case, I can't think of anything using it).

I thought the same thing but it is the case. Rubygems is using the latest version. Bundler allows you to override this default by using

bundle exec foo

When you install a gem to the system, Rubygems creates wrappers for every executable that the gem makes available. When you run an executable from the command line without bundle exec, this wrapper invokes Rubygems, which then uses the normal Rubygems activation mechanism to invoke the gem’s executable. This has changed in the past several months, but Rubygems will invoke the latest version of the gem installed in your system, even if your Gemfile.lock specifies a different version. In addition, it will activate the latest (compatible) installed version of dependencies of that gem, even if a different version is specified in your Gemfile.lock. source

Hei Matau
  • 29
  • 5
0

See also this helpful blogpost.

Michiel de Mare
  • 41,982
  • 29
  • 103
  • 134
0

You can find information on heroku's site about using thin. Also they are recommend using thin. http://devcenter.heroku.com/articles/rails3#webserver

dombesz
  • 7,890
  • 5
  • 38
  • 47