0

rails(2.3.5)と(prawn0.12.0)をインストールしました。インストールするprawntoと、gemはrailsバージョン3.2.6もインストールします。

の依存関係prawntoは次のとおりです。

prawn >= 0
rails >= 2.1

prawnto依存関係がすでに存在するのに、なぜgemがRails 3.xをインストールするのですか?

4

1 に答える 1

7

tl;dr Bundler を使用します。揺れます。

さて、これは基本的にRubyGemsで依存関係解決がどのように機能するかにかかっています。あまり詳しくない場合は、この XKCD コミック のプライマー パネルのようにすぐに理解してください。RubyGems の依存関係管理と Primer のストーリーは、複雑さの点で非常に似ています。

gem が の依存関係を指定している場合、たとえばrails >= 2.1、その gem をインストールするときに、RubyGems は現在インストールされているすべての gem を便利に無視し、Web API にクエリを実行して、Rails の最新バージョン以上の完全な最新バージョンを見つけます。に2.1

これを書いている時点で、 version が検出され3.2.6、依存関係の要件に適合するため、そのバージョンの Rails を忠実にインストールします。また、依存関係がインストールされていないgemがなくなるまで、Railsのすべての単一の依存関係、およびそれらの依存関係、およびサブサブサブサブ依存関係が完全にインストールされます。

考えると視界がぼやけてしまうので、それがどのように機能するかについては詳しく説明しません。


ここで、Bundler などの純粋な RubyGems ではないものを使用している場合は、次のような Gemfile を作成できます。

source 'http://rubygems.org'
gem 'rails', '2.3.4'
gem 'prawnto', '0.1.1'

そして走るbundle installと、魔法のようなことが起こります。Bundler は、 で指定されたすべての gem とそれらが依存する gem の依存関係を把握し、Gemfileそれらの gem のみをインストールします。

これは、prawntoRailsが必要な場合、 3.2.6 がインストールされない>= 2.1ことを意味します。これは、Railsが正確に である必要があるという別の依存関係があるためです。したがって、Rails 2.3.4 がインストールされます。 2.3.4

競合するバージョンがあり、gem A が gem B への依存関係を~> 1.0指定しているが、gem C が gem B が '= 0.5.0' である必要があるという依存関係を指定している場合、Bundler はあまり満足せず、エラーが発生します。依存関係を解決できません。


すべての Rails プロジェクトで Bundler を使用することを強くお勧めします。Rails 2 で実行されているものも含まれます。Bundler Web サイトには、Rails 2.3 プロジェクトと Bundler を開始するためのページがあります。

于 2012-06-25T05:39:36.790 に答える