2011-08-05 1 views
11

私はRailsエンジン/宝石になっているRails 3アプリを持っています。 このエンジンには、gemspecファイルの中に入れたgemの依存関係があります。Gemfileを使用してRails 3アプリでgemspecの依存関係を自動ロードする方法

私は新しい '親' Rails 3アプリを作成しました。私は自分のエンジンの宝石をGemfileに追加して、宝石の依存関係を自動的に '読み込み'したいと思っています。 bundle installはgem依存関係をうまくインストールしますが、サーバーを起動するとアプリケーションが読み込まれないためクラッシュします。

s.add_runtime_dependency(%q<rails>, ["= 3.0.7"]) 
s.add_runtime_dependency(%q<acts_as_commentable>, [">= 3.0.1"]) 
s.add_runtime_dependency(%q<haml>, [">= 3.1.1"]) 

...と親のRails 3アプリケーションがGemfileに次の行があります:

source 'http://rubygems.org' 

gem 'my_engine', :path => "~/src/gems/my_engine" 

をしかし、私は次のエラーを取得する

例えば

は、私のエンジンのgemspecは、これらの行が含まれています。

undefined local variable or method `acts_as_commentable' 
from /home/user/src/gems/my_engine/app/models/account.rb:66:in `<class:Account>' 

ただし、親レール3のGemfileにgem 'acts_as_commentable', '>= 3.0.1'を追加するとappの場合、gemがロードされ、エラーが消えます。

私はRails 3.0.8を使用しています。

誰にも提案はありますか?私のエンジンのロード方法を変更する必要がありますか?

答えて

12

メインRailsの起動時に、BundlerはGemfileに直接リストされた依存関係のみを要求しますが、サブ依存関係は要求しません。 ライブラリの/ Engineは、それ自体が必要となるときに依存関係を要求する責任があります。あなたはRailtieでイニシャライザを使用することができます。

class MyRailtie < Rails::Railtie 
    initializer "require stuff" do 
    require "stuff" 
    end 
end 
+0

これが期待される動作であることを確認してくれてありがとう。便利なように聞こえる、再帰的なGemfilesのアイデアを持ったbundlerに関するクローズド(拒否された)問題があります:https://github.com/carlhuda/bundler/issues/49 – ndbroadbent

+0

私にとっては、 /lib/my_engine.rb。例:https://github.com/krisleech/qwerty/commit/c1e82cef27013afc6a540412e101cc2b6aeb4898 – Kris

2

私はシュプレー川で探しています、そして、彼らはspree_core-0.60.1/lib/spree_core.rbでこれを行う(Railsのエンジンのスーパーヒーロー!):

require "rails/all" 

require 'state_machine' 
require 'paperclip' 
require 'stringex' 
require 'will_paginate' 
require 'nested_set' 
require 'acts_as_list' 
require 'resource_controller' 
require 'active_merchant' 
require "meta_search" 
require "find_by_param" 

だから、答えはあなたの宝石の中に、あなたはそれの宝石のすべてを必要としなければならないということです1つずつ依存関係まあ、それは今私がそれをやる方法です。しかし、今後これが変わるとコメントしてください。

1

それは私がホストプロジェクトとレール3エンジンを搭載したサブプロジェクトを作成し、動作しないようです。

require 'simple_form'

しかしに行[宝石 'simple_form']を削除した場合、以下のようにengine_name.rbする必要添加し、エンジンのgemspec

s.add_dependency 'simple_form'

に宝石を追加しましたホストプロジェクトのGemfileを使用すると、すぐに未定義と表示されます

3

私たちのRailsエンジン小さなトリックを使用して自動的に依存関係を要求していました。残念ながら、.gemspecでロードするかどうかを指定することはできません。

Gem.loaded_specs["our_rails_engine"].dependencies.each do |d| 
    begin 
    require d.name 
    rescue LoadError => le 
    # Put exceptions here. 
    raise le if d.name !~ /factory_girl_rails/ 
    end 
end 
+0

代わりに 'runtime_dependencies'を実行していますが、実際はうまくいきます。 –

関連する問題