简体   繁体   中英

Why “bundle install” try to install outdated version of gems?

I have different gemsets

> rvm gemset list
gemsets for ruby-2.0.0-p247 (found in /Users/kai/.rvm/gems/ruby-2.0.0-p247)
=> (default)
   global
   rails4

> rvm gemset use rails4
Using ruby-2.0.0-p247 with gemset rails4

> rails -v
/Users/kai/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/dependency.rb:296:in `to_specs': Could not find 'railties' (>= 0) among 43 total gem(s) (Gem::LoadError)
    from /Users/kai/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/dependency.rb:307:in `to_spec'
    from /Users/kai/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_gem.rb:47:in `gem'
    from /usr/bin/rails:22:in `<main>'
    from /Users/kai/.rvm/gems/ruby-2.0.0-p247@rails4/bin/ruby_noexec_wrapper:14:in `eval'
    from /Users/kai/.rvm/gems/ruby-2.0.0-p247@rails4/bin/ruby_noexec_wrapper:14:in `<main>'

and when I'm doing:

> bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Using rake (10.1.0) 
Installing i18n (0.6.4) 
Installing multi_json (1.7.9) 
Installing activesupport (3.2.7) 
Installing builder (3.0.4) 
Installing activemodel (3.2.7) 
Installing erubis (2.7.0) 
Installing journey (1.0.4) 
Installing rack (1.4.5) 
Installing rack-cache (1.2) 
Installing rack-test (0.6.2) 
Installing hike (1.2.3) 
Installing tilt (1.4.1) 
Installing sprockets (2.1.3) 
Installing actionpack (3.2.7) 
Installing mime-types (1.23) 
Installing polyglot (0.3.3) 
Installing treetop (1.4.14) 
Installing mail (2.4.4) 
Installing actionmailer (3.2.7) 
Installing arel (3.0.2) 
Installing tzinfo (0.3.37) 
Installing activerecord (3.2.7) 
Installing activeresource (3.2.7) 
Installing coffee-script-source (1.6.3) 
Installing execjs (1.4.0) 
Installing coffee-script (2.2.0) 
Installing rack-ssl (1.3.3) 
Installing json (1.8.0) 
Installing rdoc (3.12.2) 
Installing thor (0.18.1) 
Installing railties (3.2.7) 
Installing coffee-rails (3.2.2) 
Installing jquery-rails (3.0.4) 
Using bundler (1.3.5) 
Installing rails (3.2.7) 
Installing sass (3.2.10) 
Installing sass-rails (3.2.6) 
Installing sqlite3 (1.3.7) 
Installing uglifier (2.1.2) 
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!

But I have ruby 2.0! Why it doesn't install rails 4.0 and activesupport 4.0?

bundler installs gems basing on two files:

  1. Gemfile.lock strict versions saved during previous installation,
  2. Gemfile loose version declaration from user.

when you generate rails project first Gemfile is generated with something like this:

gem 'rails', '~> 3.2'

after the file is generated bundle install is ran which generates Gemfile.lock in which strict versions of gems are recorded, from now on any succeeding call to bundle install will install only the versions saved in Gemfile.lock .

To update gems to newer versions:

  1. check Gemfile for any version restrictions - that might prevent installing the versions you would like to get
  2. run bundle update <gem_name> to update only this single gem and what is require for it - but minimalizing scope of the changes to the smallest possible set of changes.
  3. run bundle update to update all gems to latest versions allowed in Gemfile

bundle install or in short bundle does not install the latest gem unless you have left out the version in your Gemfile. eg

gem 'rails'

But usually this is not the case, we specify versions to prevent application from "crashing" when some gems are updated and we unknowingly run bundle update , or for that matter move application to say test or production servers. Usually when adding a gem to Gemfile, we do:

gem 'rails', '~> 3.2.7'

Note the leading ~> in the version number. This says: use rails gem between versions 3.2.7 and less than 3.3.0 .

In order for your bundle command to grab rails 4.0, you need to change that line to read either one of the following:

gem 'rails', '>= 3.2.7' 

or

gem 'rails', '4.0.0'

If you use gem 'rails', '>= 3.2.7' then your rails application will use the latest gem available in your system. Note that 3.2.7 is just an example I'm using here. If you use gem 'rails', '4.0.0' then your rails application will use rails version 4.0.0.

Please note that this change might break your existing rails 3.2 application.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM