Gem Dependancies

  • Thread starter James Edward Gray II
  • Start date
J

James Edward Gray II

With HighLine, we've recently moved over to using termios... on Unix
only. I set it up as a gem dependancy and this is causing problems
with the Window's install (and we don't even need it on that
platform). That leads me to the following questions:

1. Is it possible to change dependancies based on the platform?
2. Will a gem install still if you say no to a dependancy?
3. What is The Ruby Way to handle these kinds of install issues?

Thanks for any advice.

James Edward Gray II
 
J

Jim Weirich

With HighLine, we've recently moved over to using termios... on Unix
only. I set it up as a gem dependancy and this is causing problems
with the Window's install (and we don't even need it on that
platform). That leads me to the following questions:

1. Is it possible to change dependancies based on the platform?

Not within a single gem. You could provide separate gems with different
dependencies.
2. Will a gem install still if you say no to a dependancy?

No. But you can say: gem install highline --ignore-dependencies
 
J

James Edward Gray II

Not within a single gem. You could provide separate gems with
different
dependencies.

Do a few projects do this? Can you point me toward an example project?

Is this on the RubyGems feature request list? If not, can I put it
there? :)

Thanks.

James Edward Gray II
 
J

Jeremy Hinegardner

Do a few projects do this? Can you point me toward an example project?

Is this on the RubyGems feature request list? If not, can I put it
there? :)

I'll add to it too...

I'm looking at a need for 'optional' dependencies. That is, given a
list of dependencies, at least one of them must be installed for the gem
to work.

Possibly something like:

spec = Gem::Specification.new do |s|
s.add_optional_dependency('SampleGem','>= 0.42.0')
s.add_optional_dependency('OptionalGem','>= 0.10.2')
end

Then during the gem install phase rubygems would check and make sure
that either SampleGem or OptionalGem were installed. If neither were
then prompt to see which one the user would like to have installed. Or
possibly make one of the optional dependencies the default if neither is
installed.

Thoughts anyone ?

enjoy,

-jeremy
 
G

gabriele renzi

Jeremy Hinegardner ha scritto:
I'll add to it too...

I'm looking at a need for 'optional' dependencies. That is, given a
list of dependencies, at least one of them must be installed for the gem
to work.
<snip>

I think this are called "virtual" more than optional.
I definitely agree this is needed, but I also see the need for
"optional" gems (which AFAICT are not there, though I may be wrong).
Say, actioncontroller has an utility method that rely on RedCloth.

Putting the whole RedCloth as a dependency would be an overkill, but
telling the user they *could* cooperate would be needed imho.
 
J

Jim Weirich

I'm looking at a need for 'optional' dependencies. That is, given a
list of dependencies, at least one of them must be installed for the gem
to work.

Possibly something like:

spec = Gem::Specification.new do |s|
s.add_optional_dependency('SampleGem','>= 0.42.0')
s.add_optional_dependency('OptionalGem','>= 0.10.2')
end

Then during the gem install phase rubygems would check and make sure
that either SampleGem or OptionalGem were installed. If neither were
then prompt to see which one the user would like to have installed. Or
possibly make one of the optional dependencies the default if neither is
installed.

Thoughts anyone ?

The problem is that once you get beyond simple dependencies, the requirements
could become quite complicated. Satisfying a simple one out of a set of
optional gems is only the start. The next person might need either gem A or
gems B and C. Someone else needs Gem X on platform Y but Gem W on other
platforms. What one really needs is a full constraint language to handle the
arbitrary combinations.
 
A

Aleksi

Jim said:
The problem is that once you get beyond simple dependencies, the requirements
could become quite complicated. What one really needs is a full constraint
language to handle the arbitrary combinations.

Jim, I don't want to make this sound simpler than it is, but I'd guess
we have quite good turing complete constraint language at our disposal,
namely Ruby.
The next person might need either gem A or gems B and C.

if s.gem('A').available?
s.add_dependency('A', '>= 0.42.0')
else
s.add_dependency('B', '>= 0.42.0')
s.add_dependency('C', '>= 0.42.0')
end
Someone else needs Gem X on platform Y but Gem W on
other platforms.

if s.platform == "Y"
s.add_dependency("X")
else
s.add_dependency("W")
end

I'm sure we all agree that dependency logic can get complicated, but
then it's time to start simplifying. And if that's not possible, I'm
sure someone writes dependency logic resolver in prolog, or at least
provides yet another dependency to one :).

- Aleksi
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top