rails
(2.3.5)と(prawn
0.12.0)をインストールしました。インストールするprawnto
と、gemはrails
バージョン3.2.6もインストールします。
の依存関係prawnto
は次のとおりです。
prawn >= 0
rails >= 2.1
prawnto
依存関係がすでに存在するのに、なぜgemがRails 3.xをインストールするのですか?
rails
(2.3.5)と(prawn
0.12.0)をインストールしました。インストールするprawnto
と、gemはrails
バージョン3.2.6もインストールします。
の依存関係prawnto
は次のとおりです。
prawn >= 0
rails >= 2.1
prawnto
依存関係がすでに存在するのに、なぜgemがRails 3.xをインストールするのですか?
さて、これは基本的に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 のみをインストールします。
これは、prawnto
Railsが必要な場合、 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 を開始するためのページがあります。