17

好奇心から... 以前の投稿Rails3.1 engine: can't get SLIM or HAML to work in test/dummy apptest/dummyで、Ruby に自分のアプリケーションで gem を使用するように指示する場所を尋ねました。

(明らかな?) 答えは、それをエンジンの Gemfile に入れることでした。これは機能しますが、Yehuda Katz の Post Clarifying the Roles of the .gemspec and Gemfileで彼が言及しているため、少し不快になります...

... gem を開発するとき、Gemfile は「gem の Gemfile には Rubygems ソースと単一の gemspec 行を含める必要があります」。

一方、(Rails を使用して生成されたrails plugin new my_engine) 私のエンジンの Gemfile 内には、次のようなものがあります。

# jquery-rails is used by the dummy application
gem "jquery-rails"

だからこれは正しいようです。更新:いいえ、そうではありません!以下の私の答えを見てください...

それでも、StackOverflowの別の場所で、これに対する解決策は単に必要な gem を必要とすると言われてconfig/application.rbいます。 -アプリケーションに入れるのが一番良いと言われていますlib/<your_engine>/engine.rb file

そして、ここに私の考えがあります: アプリは、ファイルtest/dummyで指定されたすべての Gem を単に自動的に要求しないのはなぜですか? 明示的にand.gemspecを使用して、運用モードと開発モードに使用するジェムをジェムに通知することもできるため、これを行わない理由はわかりません。add_dependencyadd_development_dependencytest/dummy

test/dummy最後の質問です。アプリで gem を使用するよう Ruby に指示する必要があるのは、正確にはどこですか? Ruby にホスト アプリでも GEM を強制的に使用させたくありません。

4

3 に答える 3

5

適切な進め方は次のとおりだと思います。

Engine は通常の gem です。gem を開発するときは、その依存関係をgemspecファイルに入れます。bundle を使用すると、開発者として.lock問題のない特定のバージョンのファイルを作成できます。しかし、その依存関係を で宣言するgemspecだけでは、それらを使用するのに十分ではありませんrequire。gem コードでそれらを使用する必要があります。それらが必要な場合、gem が bundle で使用されている場合、.lockバージョンが使用されます。

Engine では、他の gem と同じです。ファイルで依存関係を定義してgemspec実行しますbundle installが、それらを使用するだけでは十分ではありません。たとえば、でそれらを要求する必要がありますlib/my_engine.rb

例えば:

# File: my_engine.rspec
# ...
s.add_dependency `slim_rails`, ' ~>1.0'

# ...

# File: lib/my_engine.rb
require "my_engine/engine"
require "slim-rails"

module MyEngine
end

で設定した場合、なぜ問題なく使用されるのかわかりませんGemfileが、Rails のドキュメントには次のように書かれています。

エンジン内の Gem の依存関係は、エンジンのルートにある .gemspec ファイル内で指定する必要があります。その理由は、エンジンが gem としてインストールされる可能性があるためです。依存関係が Gemfile 内で指定される場合、これらは従来の gem インストールでは認識されず、インストールされず、エンジンが誤動作する原因になります。

于 2013-07-27T10:43:35.957 に答える
2

これが私がこれまでに見つけたものです。

エンジン ( を使用して作成) 内では、必要な gemを my_engine.gemspec ファイルでのみrails plugin new my_engine指定する必要があります。gemspec

生成されたテスト/ダミー/Gemfile コンテンツは次のとおりです。

source "http://rubygems.org"

# Declare your gem's dependencies in simple_view_helpers.gemspec.
# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.
gemspec

# jquery-rails is used by the dummy application
gem "jquery-rails"

# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
# Git. Remember to move these dependencies to your gemspec before releasing
# your gem to rubygems.org.

# To use debugger
# gem 'debugger'

ここで行gem "jquery-rails"が何をしているのか、私には本当にわかりません。コメントで提案されていることと完全に矛盾しているようです。一方、テスト/ダミー アプリケーションで (ERB の代わりに) SLIM gem を使用しようとすると、Gemfile で指定する必要があるようです。そうしないと機能しません。まだ少し混乱しています、これは...

于 2012-09-27T13:41:55.540 に答える
2

TL;DR:

GemfileEngine の開発時には any を使用しないでください。すべてをエンジンに入れgemspec、エンジン自体に必要なものすべてを要求させます。


test/dummy アプリが、.gemspec ファイルで指定されたすべての Gem を単に自動的に要求しないのはなぜですか?

パフォーマンス上の理由から、アプリケーションがエンジンの依存関係を自動的に必要とすることはないと思います。

したがって、ダミーアプリがエンジンを使用した実際のアプリの本格的なシミュレーションであると想定されている場合、それも行うべきではありません。

また、ダミー アプリ開発依存関係を含むすべての依存関係を自動的に要求すると仮定します。その場合、開発依存関係の 1 つが実際にはランタイム依存関係であったとしても、テストが成功する可能性があります。それは本当に迷惑です。

config/application.rb で必要な gem を単に必要とすると言われています

これにより、エンジンの実行時の依存関係もマスクされる可能性があるため、これを行わないことをお勧めします。

最後の質問です。テスト/ダミーアプリでgemを使用するようにRubyに指示する必要があるのはどこですか? ホストアプリでもルビーに宝石を強制的に使用させたくありません。

その宝石がテストにのみ必要な場合は、テスト/仕様ヘルパーでそれを必要とします。

それ以外の場合、エンジンの実行にその gem が必要な場合は、実際にその使用を強制する必要があります。

James: これは、エンジンの依存関係は gemspec にあり、ダミーアプリの依存関係は Gemfile にあると私に信じ込ませます。

ダミー アプリのバンドラー スタブは、実際には、ダミー アプリ自体の欠落した Gemfile を参照します。だからわざと残してるんでしょうね。そして、それは完全に理にかなっています。

このように考えてください: ダミー アプリを変更するために何かを行うと、中立的な背景に対してテストが実行されなくなり、結果として代表的ではなくなります。

エンジンを再利用できるようにして、空の新しい Rails アプリにそれをドロップしたい場合は、ダミーのアプリはまさにそれである必要があります。つまり、空の新しい Rails アプリです。

于 2015-11-23T18:30:58.117 に答える