Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

10 views
Skip to first unread message

Erik Veenstra

unread,
Aug 1, 2008, 9:54:10 AM8/1/08
to
[Note: parts of this message were removed to make it a legal post.]

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/

shadowf...@gmail.com

unread,
Aug 1, 2008, 10:18:12 AM8/1/08
to
This is exactly the problem that brought me to rubytalk a week ago. I
don't seem to have left yet (::grin::)

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.


--
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

Erik Veenstra

unread,
Aug 1, 2008, 10:26:39 AM8/1/08
to
[Note: parts of this message were removed to make it a legal post.]

> I didn't need to require if the object in question was


> referenced inside a method definition.

Could you please elaborate?

shadowf...@gmail.com

unread,
Aug 1, 2008, 10:38:55 AM8/1/08
to
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 Veenstra <erik...@gmail.com> 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/
>

Ryan Davis

unread,
Aug 1, 2008, 3:09:08 PM8/1/08
to

On Aug 1, 2008, at 06:54 , Erik Veenstra 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).

Daniel Moore

unread,
Aug 3, 2008, 1:52:56 AM8/3/08
to
Is there a work-around for getting rubyscript2exe to work in the meantime?

On Fri, Aug 1, 2008 at 6:54 AM, Erik Veenstra <erik...@gmail.com> 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

Erik Veenstra

unread,
Aug 3, 2008, 5:58:21 AM8/3/08
to
[Note: parts of this message were removed to make it a legal post.]

> 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...

Eric Hodel

unread,
Aug 6, 2008, 7:40:08 PM8/6/08
to
On Aug 1, 2008, at 06:54 AM, Erik Veenstra 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.


Erik Veenstra

unread,
Aug 7, 2008, 7:21:02 AM8/7/08
to
> Can you file a bug for me in the rubygems tracker?

Done.

gegroet,
Erik V.

ipp...@gmail.com

unread,
Aug 8, 2008, 10:16:53 PM8/8/08
to

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?

Ryan Davis

unread,
Aug 9, 2008, 5:52:17 AM8/9/08
to

On Aug 8, 2008, at 19:18 , ipp...@gmail.com 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.


ipp...@gmail.com

unread,
Aug 9, 2008, 11:51:02 AM8/9/08
to
On 9 Aug, 11:52, Ryan Davis <ryand-r...@zenspider.com> wrote:


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)

Andrew Goifeld

unread,
Sep 19, 2008, 10:10:25 AM9/19/08
to

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.
--
Posted via http://www.ruby-forum.com/.

0 new messages