web-dev-qa-db-ja.com

Railsエンジン-Gems依存関係、それらをアプリケーションにロードする方法?

ここではエンジンを使用していますが、スタンドアロンで問題なく動作します。

それをgemに変換し、別のアプリケーション内にロードすると、エンジンgemの依存関係に起因する多くの未定義エラーが発生します。

これがgemspecです:

s.add_dependency('Paperclip')
s.add_dependency('jquery-Rails')
s.add_dependency('Rails3-jquery-autocomplete')
s.add_dependency('remotipart')
s.add_dependency('cancan')

アプリケーションで、バンドルインストールを実行すると、これらの依存関係がすべて一覧表示されますが、アプリケーションを実行すると、未定義のメソッドエラーが多数表示されます(たとえば、Paperclipからのhas_attachment)。アプリケーションがエンジンの依存関係をロードしていないようです。これはデフォルトの動作ですか?変更できますか?エンジン内のプラグインでも同じことが起こりました。

これらの宝石を手で挿入すると、アプリケーションGemfileですべて機能します...

47
Tiago

それらをgemfileに含めて、bundle installを実行します。次に、lib/<your_engine>/engine.rb file。ルビジェムを要求することを忘れないでください

  require 'rubygems'
  require 'Paperclip'
  require 'jquery-Rails'
  require 'Rails3-jquery-autocomplete'
  require 'remotipart'
  require 'cancan'

次に、ホストアプリ(gemを組み込んだアプリ)でバンドルのインストール/バンドルの更新を実行します(バンドルの更新でうまくいきました)。その後、すべてが完全に機能するはずです。ホストアプリでコンソールを起動し、モジュール名を入力するだけでこれをテストすることもできます。

Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip

お役に立てれば

76

Danielが投稿したように手動で要求することも、自動的に要求することもできます。 3つのファイルに依存関係を追加する必要があります。

  • yourengine.gemspec

    s.add_dependency "Rails", '4.1.0'
    s.add_dependency "sqlite3"
    
  • Gemfile

    # Imports dependencies from yourengine.gemspec
    gemspec
    
  • lib/yourengine.rb

    # requires all dependencies
    Gem.loaded_specs['yourengine'].dependencies.each do |d|
     require d.name
    end
    
    require 'yourengine/engine'
    
    module Yourengine
    end
    

更新:依存関係を要求する方法の単純化したデモです。それをテストして、不要なアイテムをフィルタリングする必要があります。例:d.type ==:development(thx @ imsinu9)でない限り、d.nameが必要

23
carlosvini

ペーパークリップから [〜#〜] readme [〜#〜]

Rails以外で使用する場合:

class ModuleName < ActiveRecord::Base
  include Paperclip::Glue
  ...
end

私は同じ問題を抱えていましたが、それで解決しました。

2
tali

Gemファイルを.gemspecファイルとengine.rbファイルの両方に追加する必要があります。 .gemspecファイルでは、次のようになります:s.add_dependency "kaminari", "0.16.1"

上部のengine.rbファイルに次を追加します:require "kaminari"

Rails engine Gemfile and bundle installにもgemを追加する必要があると思いますが、必要かどうかはわかりません。

1
yoyodunno

単純なbundlerコマンドを使用して、環境のすべてのgemを含めることができます。

Bundler.require(*Rails.groups)

これをconfig/initializerに追加できます。

0
sbonami

現時点では(Rails 3.1以上だと思います)、test/dummy/Gemfileでgemを宣言する必要はもうありません。

Test/dummy/Gemfileからの引用(Rails plugin new my_engine --fullを使用して生成):

Simple_view_helpers.gemspecでgemの依存関係を宣言します。 Bundlerはランタイム依存関係を基本依存関係のように扱い、開発依存関係はデフォルトで:developmentグループに追加されます。

Gemspecではなく、ここでまだ開発中の依存関係を宣言します。これらにはEdge RailsまたはパスまたはGitからのgemが含まれます。gemをrubygems.orgにリリースする前に、これらの依存関係をgemspecに移動することを忘れないでください。

0
Joshua Muheim

あなたは本当にGemsec上でそれらを必要とすべきではなく、それらはロードされるべきです。 「これがgemspecです」と言うと、それをGem::Specification.new do |s|などで囲みます。

0
chesterbr