8

Rails3 エンジン アプリケーションを開発しており、ビューに Haml を使用したいと考えています。

まず、これをエンジンの Gemfile に追加しました。

gem "haml"

エンジンをテストしている間、問題なく動作していました ( https://github.com/josevalim/enginexを使用して gem を生成し、ダミー アプリケーションでテストしました)。

このエンジンを実際の Rails アプリケーションで使用しようとしたときに問題が発生しました。アプリケーションには独自の Gemfile に gem "haml" がないため、Haml を初期化していませんでした。そのため、.haml ビューを探していないため、テンプレートが見つからないというエラーを受け取りました。エンジンに Haml を要求することで、Rails アプリケーションからも要求されれば十分だと考えていました。

今のところ私が行ったことは、次のコードを使用してエンジンに config/initializers/haml.rb を追加することでした:

require 'haml'
Haml.init_rails(binding)

現在は機能していますが、これが本当に良い方法なのかどうか疑問に思っています。Rails が Haml の "init.rb" ファイルを呼び出さず、エンジンの Gemfile に gem "haml" を追加するだけで Haml を正しく初期化するのはなぜですか?

4

2 に答える 2

20

2つのことが必要です。まず、.gemspec で:

s.add_dependency 'haml', ['>= 3.0.0']

そしてあなたのlib/gem_name.rbで:

require 'haml'

そしてbundle、gem ディレクトリと app ディレクトリの両方で実行します。

于 2011-08-04T09:05:29.380 に答える
6

バンドラーがターゲット アプリケーションに haml をインストールする (そしてその Gemfile.lock に表示される) ようにするには、エンジンの gemspec に haml を依存関係として配置する必要があると思います。このようなもの:

Gem::Specification.new do |s|
  s.add_dependency(%q<haml>, [">= 0"])
end

私は自分のエンジンの 1 つでこれをテストしました。.gemspec に依存関係がないため、ターゲット アプリに haml がインストールされませんでした (Gemfile.lock には表示されませんでした)。haml を依存関係として gemspec に追加すると、次のように表示されます。

PATH
  remote: /rails_plugins/mine/my_engine
  specs:
    my_engine (0.0.0)
      formtastic
      haml
      inherited_resources
      settingslogic
      sqlite3-ruby

GEM
  remote: http://rubygems.org/
  specs:
    #................
    haml (3.0.25)
    #................

jeweler を使用している場合は、Gemfile の内容に基づいて依存関係が gemspec に自動的に追加されます。Gemfile でグループが定義されている場合は、development_dependency も追加されます。私は簡単に enginex を見ただけなので、gemspec を構築するための同様の rake タスクがあるかどうかはわかりません。

これはいくつかのことを明確にするのに役立つかもしれません:

http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

于 2011-02-16T13:45:19.653 に答える