After a brief discussion with Eric Hodel about this, there are a few questions before we can figure out how to solve this:

1) Why are all gems being required in gem_prelude in the first place? Eric wasn't sure, we thought that perhaps this was a requirement that ruby-core had.

2) If all gems are required in gem_prelude, what's the expected behavior for version conflicts?

For example:

gem old_A requires gem B version 1.0
gem new_C requires gem B version 2.0

Because we're requiring them all automatically, we'll get old_A and B version 2.0. This means that old_A will very likely not work at all.

This is not a contrived example, it's very easy for people to have old gems installed.

It's true this can exist in 1.8, but because a user has typically explicitly required some gems, it happens much less often. And in this case, the user can fix the situation themselves by removing the gem requirements in their particular code.

This problem is hit especially often by rails users, because they use a large number of gems. As more users are using rails on 1.9, this problem will get worse as newer versions of gems are released and installed but not everything is upgraded to new versions.


My recommendation is that gem_prelude not require any gems and simply provide the functionality to automatically load all of rubygems if it's used.

One addition to gem_prelude would probably be it's custom require so that user can load code from gems directly.

The behavior then will be just as it is in 1.8.

 - Evan Phoenix


On Apr 12, 2010, at 5:45 PM, Aaron Patterson wrote:

> Bug #3140: gem activation has changed between 1.8 and 1.9
> http://redmine.ruby-lang.org/issues/show/3140
> 
> Author: Aaron Patterson
> Status: Open, Priority: Normal
> Target version: 1.9.2
> ruby -v: ruby 1.9.2dev (2010-04-12 trunk 27317) [x86_64-darwin10.2.0]
> 
> 1.8 will raise gem activation errors where ruby 1.9 will not.
> 
> To reproduce this bug, first install these gems:
> 
>  $ gem install rubygems-bug-parent
>  $ gem install rubygems-bug-child
> 
> Your gem list should look like this:
> 
> $ gem list rubygems-bug
> 
> *** LOCAL GEMS ***
> 
> rubygems-bug-child (1.1, 1.0)
> rubygems-bug-parent (1.0)
> 
> Then run the following program:
> 
>    $ ruby -rubygems -e "require 'rubygems-bug-child'; require 'rubygems-bug-parent'"
> 
> Ruby 1.8 will raise an activation error because of the conflicting versions:
> 
> Here I am in version 1.1
> /Library/Ruby/Site/1.8/rubygems.rb:230:in `activate': can't activate rubygems-bug-child (= 1.0.0, runtime) for ["rubygems-bug-parent-1.0"], already activated rubygems-bug-child-1.1 for [] (Gem::LoadError)
> 	from /Library/Ruby/Site/1.8/rubygems.rb:246:in `activate'
> 	from /Library/Ruby/Site/1.8/rubygems.rb:245:in `each'
> 	from /Library/Ruby/Site/1.8/rubygems.rb:245:in `activate'
> 	from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:35:in `require'
> 	from -e:1
> 
> Ruby 1.9 will continue along using the 1.1 version, and never detect the version conflict:
> 
> $ ruby -rubygems -e "require 'rubygems-bug-child'; require 'rubygems-bug-parent'"
> Here I am in version 1.1
> 
> 
> ----------------------------------------
> http://redmine.ruby-lang.org
> 
>