2011-01-02 9 views
2

私はユーザー提供のルビコードを読み込むフレームワークを構築しています。これは基本的にプラグインの仕組みです。私は、ユーザがそれ自身の宝石を要求できるようにするためにルビコードを提供したい。私は、 "プラグイン"パッケージに宝石のベンダーディレクトリを含めるつもりです。ruby​​ gemの競合するバージョンを管理する

プラグインが必要とする宝石をフレームワークの宝石と衝突させずにロードするにはどうしたらいいですか?たとえば、私のフレームワークがtreetopバージョン1.3.0を使用し、プラグインがtreetop 1.4.2を使用する場合、それぞれが指定されたバージョンで動作するようにします。

同様に、プラグインが互いに競合するのを防ぐ手段はありますか?

私はgem_plugin、_whyのサンドボックス、およびその他のツールを見てきました。しかし、私はこのケースを特別に扱うライブラリは見当たりません。

また、Bundlerの内部で宝石のバージョンを管理する方法を調べました。私は必要があればかなり複雑なものをやる準備ができています。しかし、私はそれについてどうやって行くのかまだ分かりません。

私はこれをどのように実装するかについて多くの自由を持っています。だから私が間違った木を鳴らしていると思ったら、そう言いなさい。

ありがとうございました。

SIDE注:これは、Javaサーブレットコンテナ内のClassloaderに似たものが必要だと書いている間に私に起こりました。 WARファイルにはjarファイルを含めることができ、Webアプリケーションのクラスローダーはグローバルクラスパス上のjarファイルよりも優先します。 Rubyに "classpath"(つまりload_path、requireなど)を分割する方法はありますか?

+0

私の問題は、これと基本的に同じである可能性があります。 2つの異なる宝石の代わりに、私は同じ宝石の2つのバージョンを扱っています。 – codefinger

答えて

5

同じ宝石の2つのバージョンを同時にロードすることはできません。

Bundlerは、必要なすべての宝石を調べ、さまざまな重複する依存関係の解決策を見つけることはできますが、一度に1つのバージョンの宝石のみをロードすることに限られています。

これは、あなたが記述している状況だけを避けるために、従属宝石で行われた変更を常にサポートするために更新する必要があるプラグイン開発者につながります。

は(私は、さまざまな競合JSONの実装と、あなたは、いくつかの宝石を持っていたときに通過しなければならない苦痛からの結果は、すべての必要なさまざまなものを依存関係というのねじアップを始めるないでください。)

+0

それは私が恐れていたものです。これを記述するrubyのドキュメントへの参照を知っていますか? – codefinger

+0

同じ名前の複数の環境で_something_を実行できるこの記事を読むことができます。 http://yehudakatz.com/2010/04/21/named-gem-environments-and-bundler/しかし、あなたの例では、プラグインと同じgemバージョンを使用するようにアプリケーションを再コーディングするか、プラグインをフォークします最新のバージョンのgemをサポートし、アプリを同じように更新しました。 – stef

0

謹んでに反対します上記の答え。ここで私はそれを行う方法です。

ロックリスト

require 'rubygems' 
gem 'my_gem', '= 1.0.0' 
gem 'gem_base', '= 1.0.0' 
gem 'rest-client', '= 1.7.2' 
gem 'savon', '= 1.1.0' 
gem 'addressable', '= 2.3.6' 
gem 'mime-types', '= 1.25.1' 
gem 'netrc', '= 0.11.0' 

に特定のバージョンの依存関係のリストを生成し

ruby -S gem list my_gem

`*** LOCAL GEMS *** 
my_gem (1.0.1, 1.0.0, 0.0.2) 
` 

ruby -S gem lock my_gem-1.0.0 > locklist.rb

今あなたがロードするload('locklist.rb')を行うことができます特定のバージョンの宝石とその依存関係ママ、バンドルは見ないよ。

関連する問題