1

これは好奇心の問題であり、問​​題ではありません。システムに多くのバージョンが存在する場合、requireコマンドを使用するときにどのバージョンが選択されますか? 話の背景は:bundlerプロジェクト (Rails プロジェクトではない) で gem を実装していました。私には問題はありませんでしたが、他の開発者には問題がありました。簡単な調査の結果、私は使用していないことに気付きました

require "bundler/setup"

基本的にバンドルされた宝石をロードします。簡単な修正ですが、ruby via ruby​​gems がどの gem を使用するかをどのように決定するのか疑問に思いました。Ruby アプリケーションが古いバージョンの gem を使用し、新しいバージョンを使用しなかったため、コードが破損したためです。「最新」のgemを使用しないということは、その背後にあるロジックは何ですか?

アップデート

この質問をさらに説明するために、宝石を持っているとしましょう。あなたが言うとき、ルビーはどの宝石foo-1.0.1foo-1.0.2ロードrequire 'foo'するかをどのように判断しますか?

4

2 に答える 2

3

Rubyでは、 gemではなくファイルrequireを使用します。そのファイルが現在のロードパスで見つからない場合、Rubygemsはインストールされているgemでその名前のファイルを検索し、見つかった場合はgemがアクティブ化され(つまり、laodパスに追加されます)、ファイルは次のようになります。その後、必要です。通常、gemのディレクトリには同じ名前のファイルがあります。1つのバージョンのgemのみをアクティブ化できます。lib

アクティブ化されるgemは、他のアクティブ化されたgemと互換性のある最新バージョンです。通常、これはインストールされている最新バージョンがアクティブ化されることを意味しますが、アクティブ化しようとしている以前のバージョンのgemへの依存関係を宣言するいくつかのgemをすでにアクティブ化している場合はそうではない可能性があります。

たとえば、インストールしてfoo-1.0.1インストールfoo-1.0.2した場合、 (dirsに名前がrequire 'foo'付けられたファイルがあり、他のgemにはない場合)、バージョン1.0.2がアクティブ化されます。ただし、依存関係のあるgemもある場合は、アクティブ化された後に呼び出すと、1.0.1がアクティブ化されます。foo.rblibbar1.0.1require 'foo'barfoo

さらに、他の順序でそれらを要求しようとすると、次のrequire 'foo'; require 'bar';ようなものが得られます

Gem::LoadError: Unable to activate bar-1, because foo-2 conflicts with foo (= 1)

ここでは、をアクティブ化できません。これは、のバージョン1.0.2を既にアクティブ化しているためbar、のバージョン1.0.1に依存します。foofoo

于 2012-12-12T15:01:48.520 に答える
0

Bundler を使用しない場合、必要な各 gem を指定する必要があります。例えば、

require 'my_gem'
require 'my_other_gem'

ただし、Bundler を使用すると、これを少し簡単に行うことができます。Gemfile

これがあなたの場合Gemfile

gem 'my_gem'
gem 'my_other_gem'

これを呼び出すと、すべての宝石が含まれます

require 'bundler/setup'
于 2012-12-11T22:33:14.457 に答える