3

tl;dr

より大きなアプリケーションの一部をマウント可能なエンジンとして分割しようとしています。エンジンはさまざまなフレーバーで存在し、それぞれが独自の gem に含まれています。エンジン定数名と異なる宝石名を取得できません。

詳細

抽出された部分には、登録、認証、およびセッション処理のロジックが含まれています。このアプリケーションは、製品を使用する最終顧客に関するさまざまな要件と規制を持つ世界のさまざまな地域のクライアントによって使用されています。これにより、規制地域ごとにこれらのニーズに対応する個別のモジュールを作成するようになりました。それらは現在 lib ディレクトリにあり、構成に応じてさまざまな実装がロードされます。

エンジンの目的は、適切なエンジンをマウントし、routes ファイルが関連するすべての呼び出しをエンジンにルーティングすることです。

このような登録モジュールがいくつかあるため、バリアント用にいくつかの gem を維持する必要があります。gem の名前が異なる (auth_A、auth_B など) ようにしようとしていますが、含まれているエンジンの定数名は Auth::Engine と同じです。

そうすれば、Gemfile に正しい gem を含めることができ、実行中のバージョンに関係なくルーティング先のエンドポイントが常に同じであるため、残りはそのまま機能します。

問題

私が遭遇した問題は、gem に 1 つの名前を付け、エンジン定数を別の名前にすることができないということです...

新しいエンジン名の認証を生成すると、それをメイン アプリにマウントしても問題なく動作します。次に、gem 名と格納フォルダーを auth_a に変更し、ホスト アプリの Gemfile を更新すると、機能しなくなります。正常にバンドルできますが、ホスト アプリを起動しようとすると、エンジンのマウントに関連付けられているときに失敗し、Auth:: と不平を言います。エンジンは未定義の定数です。

私の、わずかに編集された、gemspec は次のようになります。

$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "auth/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "auth_a"
  s.version     = Auth::VERSION
  s.authors     = ["Jonas Schubert Erlandsson"]
  s.email       = ["jonas.schubert.erlandsson@xxxxxx.com"]
  s.homepage    = "http://some.page.on/the/internet.html"
  s.summary     = "Authentication module for A"
  s.description = "This engine, when mounted in Host app, handles registration, account update, login and logout of users."

  s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]

  s.add_dependency "rails", "~> 3.2.13"
end

生成された足場から変更したのはs.name = "auth_a". ホスト アプリの Gemfile からの関連する行: gem 'auth_a', path: "../auth_a"...

ソースツリー全体を調べて、宝石名から名前を推測する場所を見つけようとしましたが、それがわかりません。何が欠けているのかわからず、宝石仕様のドキュメントもこれにはあまり役に立ちませんでした...宝石名が宝石の定数名にバインドされているとは思いませんでしたが、多分私は違う?オーバーライドできますか?それとも、他に何か不足していますか?

4

1 に答える 1

5

これに対する答えは、これをホスト アプリの Gemfile: の行に単純に追加することでしたgem 'auth_a', path: "../auth_a", require: 'auth'

そのため、デフォルトでは、gem 名に基づいた定数を要求する、つまり自動ロードするように見えますが、require 呼び出しは、代わりに何を要求するかを伝えます。

それが他の誰かにも役立つことを願っています:)

于 2013-03-19T15:26:59.350 に答える