[Rubygems-developers] conflict when rubygems generated wrapper tries to load autotest executable on ruby 1.9

lasitha lasitha.ranatunga at gmail.com
Wed Feb 25 07:51:49 EST 2009


On Sat, Feb 21, 2009 at 2:20 AM, lasitha <lasitha.ranatunga at gmail.com> wrote:
> Hello All,  while trying out autotest (from ZenTest) on ruby 1.9 i ran
> into a load path problem and i'd appreciate some insight on whether
> rubygems might help sort it out.
>
> The exception is something like:
> /usr/local/ruby1.9/bin/autotest:19:in `load': Is a directory -
> /usr/local/ruby1.9/lib/ruby/gems/1.9.1/gems/cucumber-0.1.16/lib/autotest
> (Errno::EISDIR)
>        from /usr/local/ruby1.9/bin/autotest:19:in `<main>'
>
> This is a confluence of several disparate factors, but i'll try to
> break it down:
> * Autotest provides a discovery process that scans for information
> contained within directories named 'autotest' on the load path.
> * Several gems (e.g. rspec, cucumber, merb) leverage this feature by
> providing their own lib/autotest directories.
> * Ruby 1.9 starts up with all gem bin/lib directories on the load path.
> * The autotest executable is also named 'autotest'.
> * So when the rubygems generated wrapper tries to load 'autotest', it
> hits one of the autotest directories (from another gem) before it hits
> the autotest executable.
>
> The load call then dies with something like:
>
> I can think of several ways to resolve this:
> 1. ZenTest could rename its executable or its discovery convention.
> 2. Ruby could ignore directories when it tries to load a file.
> 3. Rubygems could pass an absolute path to load.
>
> Are there any downsides to #3 ?  By the time the wrapper is ready to
> load the executable we've already resolved which version of the gem to
> load so it seems like determining the absolute path is only a little
> more work.
>
> Are there scenarios other than this one with autotest in which a
> similiar conflict might occur?  In other words, is it an edge case
> unique to autotest or might we run into other such conflicts?
>
> I'm happy to follow up on options #1 or #2 (or any others) but my
> initial guess was they would be harder or take longer to effect than
> #3.
>

This is mostly a bump, but i thought this code snippet might better
describe what i'm on about:

--- a/trunk/lib/rubygems/installer.rb
+++ b/trunk/lib/rubygems/installer.rb
@@ -433,1 +433,1 @@
-load '#{bin_file_name}'
+load File.join( Gem.loaded_specs['#{@spec.name}'].full_gem_path,
'#{@spec.bindir}', '#{bin_file_name}' )

That would be enough to get autotest working on ruby 1.9.
Any downsides?

Thanks,
lasitha.


More information about the Rubygems-developers mailing list