About circular dependencies in RubyGems (the library). And about the order in $"

Hi,

There’s a circular dependency in RubyGems. I mean in the
library itself, not in the collection of gems.

Try this:

$ RUBYOPT= ruby -e ‘require “rubygems/exceptions”’
/usr/local/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:19:
uninitialized constant Gem::Exception (NameError)
from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:4:in
require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:4 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:10:in require’
from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:10
from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:767:in
require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:767 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/exceptions.rb:1:in require’
from /usr/local/lib/ruby/site_ruby/1.8/rubygems/exceptions.rb:1
from -e:1:in `require’
from -e:1

The main script requires rubygems/exceptions.rb, which requires
rubygems.rb, which requires rubygems/exceptions.rb (which is
skipped since it has already been required (although is not yet
listed in $"…)) and rubygems/source_index.rb, which requires
rubygems/spec_fetcher.rb, which requires
rubygems/remote_fetcher.rb, which defines class FetchError as a
subclass of Gem::Exception, which fails since Gem::Exception
has not yet been defined (rubygems/exceptions.rb is still on
line 1).

This causes RubyScript2Exe to fail. RubyScript2Exe sequentially
requires every entry in $" when tracing the application. It’s
essentially doing this:

$ export RUBYOPT=
$ ruby -r $THE_LIBRARY -e ‘puts $"’ | xargs ruby -e ‘ARGV.each{|x| puts
x ;
require x}’

Which works for all libraries on my machine, except for
RubyGems.

The essence of the problem is a bit nasty: a library is only
added to $" after it’s executed, so the order in which the
libraries appear in $" is reversed. Well that’s true for
indirect dependencies (app requires a, which requires b, which
requires c ==> $" == [“c.rb”, “b.rb”, “a.rb”], but not for
sequential dependencies (app requires a, b and c ==> $" ==
[“a.rb”, “b.rb”, “c.rb”]).

Question: Is it possible to investigate the exact order in which
libraries are required correctly? Obviously $" won’t work. We
can’t wrap Kernel#require either, since you’ll miss the
libraries which are required on the command line or in $RUBYOPT.

Any ideas/suggestions/comments?

Thanks.

gegroet,
Erik V. - http://www.erikveen.dds.nl/

This is exactly the problem that brought me to rubytalk a week ago. I
don’t seem to have left yet (::grin::slight_smile:

My problem was solved by realising that I had too many 'require’s – I
didn’t need to require if the object in question was referenced inside
a method definition. I don’t know if that will help you.

On 8/1/08, Erik V. [email protected] wrote:

     from
     from -e:1:in `require'

line 1).
RubyGems.
libraries are required correctly? Obviously $" won’t work. We
can’t wrap Kernel#require either, since you’ll miss the
libraries which are required on the command line or in $RUBYOPT.

Any ideas/suggestions/comments?

Thanks.

gegroet,
Erik V. - http://www.erikveen.dds.nl/


Me, I imagine places that I have never seen / The colored lights in
fountains, blue and green / And I imagine places that I will never go
/ Behind these clouds that hang here dark and low
But it’s there when I’m holding you / There when I’m sleeping too /
There when there’s nothing left of me / Hanging out behind the
burned-out factories / Out of reach but leading me / Into the
beautiful sea

I didn’t need to require if the object in question was
referenced inside a method definition.

Could you please elaborate?

Thanks.

gegroet,
Erik V. - http://www.erikveen.dds.nl/

On Aug 1, 2008, at 06:54 , Erik V. wrote:

There’s a circular dependency in RubyGems. I mean in the
library itself, not in the collection of gems.

I’ll talk to eric about this at lunch (5 min).

Sure.

Assuming you keep each class in a seperate file:

require ‘person’
#require ‘employee’ # this is not necessary

class Accountant < Person
def initialize()
@payrollid = Employee.getnewid()
end
end

Of course, for the code to work, then somewhere in your application,
some file must require employee. If you want to make sure that
each file will require everything that it will need at runtime – for
example, if you are going to do unit testing – then one solution is
to do this:

require ‘person’

class Accountant < Person
require ‘employee’

def initialize()
@payrollid = Employee.getnewid()
end
end

On 8/1/08, Erik V. [email protected] wrote:

I didn’t need to require if the object in question was
referenced inside a method definition.

Could you please elaborate?

Thanks.

gegroet,
Erik V. - http://www.erikveen.dds.nl/


Me, I imagine places that I have never seen / The colored lights in
fountains, blue and green / And I imagine places that I will never go
/ Behind these clouds that hang here dark and low
But it’s there when I’m holding you / There when I’m sleeping too /
There when there’s nothing left of me / Hanging out behind the
burned-out factories / Out of reach but leading me / Into the
beautiful sea

Is there a work-around for getting rubyscript2exe to work in the
meantime?

On Fri, Aug 1, 2008 at 6:54 AM, Erik V. [email protected]
wrote:

Hi,

There’s a circular dependency in RubyGems. I mean in the
library itself, not in the collection of gems.
This causes RubyScript2Exe to fail.

-Daniel

On Aug 1, 2008, at 06:54 AM, Erik V. wrote:

There’s a circular dependency in RubyGems. I mean in the
library itself, not in the collection of gems.

Try this:

$ RUBYOPT= ruby -e ‘require “rubygems/exceptions”’
/usr/local/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:19:
uninitialized constant Gem::Exception (NameError)

Yes, I could merge rubygems/exception.rb back into the appropriate
places, but got lazy during my refactor. Can you file a bug for me in
the rubygems tracker?

[…]

Question: Is it possible to investigate the exact order in which
libraries are required correctly? Obviously $" won’t work. We
can’t wrap Kernel#require either, since you’ll miss the
libraries which are required on the command line or in $RUBYOPT.

Any ideas/suggestions/comments?

I’m not sure what a good general solution to this problem is.

Can you file a bug for me in the rubygems tracker?

Done.

gegroet,
Erik V.

Is there a work-around for getting rubyscript2exe to work in
the meantime?

Add “require ‘rubygems’” in your application and temporarily
remove rubygems from RUBYOPT before compiling:

$ RUBYOPT= ruby rubyscript2exe.rb test.rb

Or:

C:> unset RUBYOPT
C:> ruby rubyscript2exe.rb test.rb

That seems to work. At least, on my machine…

gegroet,
Erik V. - http://www.erikveen.dds.nl/

On 3 Aug, 11:58, Erik V. [email protected] wrote:

Or:

C:> unset RUBYOPT
C:> ruby rubyscript2exe.rb test.rb

That seems to work. At least, on my machine…

gegroet,
Erik V. -http://www.erikveen.dds.nl/

This doesn’t work on my XP machine with newest oneclick rubyinstall
and rubygems 1.2 (same Gem::Exception error as usual)
I’ve tried with both rubyscript2exe and rubyscript2exe.rb. Do you have
any other workaround ideas until something is made about rubygems?

On Aug 8, 2008, at 19:18 , [email protected] wrote:

This doesn’t work on my XP machine with newest oneclick rubyinstall
and rubygems 1.2 (same Gem::Exception error as usual)
I’ve tried with both rubyscript2exe and rubyscript2exe.rb. Do you have
any other workaround ideas until something is made about rubygems?

While there IS a fix that we can add to a file in rubygems, I think it
is necessary to point out that rubyscript2exe is going to have these
problems again and again. Depending on $LOADED_FEATURES is going to be
problematic.

Also, are you sure you added “require ‘rubygems’” at the top of your
app? It really should fix the issue.

unknown wrote:

On 9 Aug, 11:52, Ryan D. [email protected] wrote:

problematic.

Also, are you sure you added “require ‘rubygems’” at the top of your �
app? It really should fix the issue.

I’ve tried with and without require ‘rubygems’ on top of hello.rb,
actually I’ve tried all possible combinations of theese 4 lines:

require “rubygems”

require “rubyscript2exe”

exit if RUBYSCRIPT2EXE.is_compiling?

puts “hello world!”

“rubyscript2exe hello.rb” always gives me this: http://pastie.org/250556

(The remote_fetcher.rb:19: uninitialized constant Gem::Exception
(NameError) error)

Hi guys,

I am a newbie with ruby. I have an identical problem as described above
and my output matches http://pastie.org/250556. Is there a workaround /
fix ? Have I missed anything?

I am just using helloworld.rb

Much appreciated…
Andy.

On 9 Aug, 11:52, Ryan D. [email protected] wrote:

problematic.

Also, are you sure you added “require ‘rubygems’” at the top of your
app? It really should fix the issue.

I’ve tried with and without require ‘rubygems’ on top of hello.rb,
actually I’ve tried all possible combinations of theese 4 lines:

require “rubygems”

require “rubyscript2exe”

exit if RUBYSCRIPT2EXE.is_compiling?

puts “hello world!”

“rubyscript2exe hello.rb” always gives me this: http://pastie.org/250556

(The remote_fetcher.rb:19: uninitialized constant Gem::Exception
(NameError) error)