1

config.ru と Gemfile を持つ親ラック アプリケーションがあり、app/ 内にいくつかのレールとシナトラ アプリケーションをマウントしようとしています。マウントされた各アプリケーションには、独自の Gemfile (独立して開発できるようにするため) と独自のデータベース (マウントされた各アプリケーションのルートから rake タスクを利用できます) があります。次に、マウントされた各アプリケーションにロードされる親 config.ru を読み取る単一のユニコーン マスター プロセスを親ルートから実行しようとしています。

rvm とバンドラーを使用しています。マウントされた各アプリケーションと親アプリケーションはbundle install、gem を同じ gemset にインストールします。

したがって、私が抱えている問題はbundle exec unicorn -c app/unicorn.conf -E development、親ラックアプリのルートから実行すると、マウントされたアプリケーションの Gemfile で必要な gem が親の Gemfile で利用できないというエラーが発生することです。(たとえば、レールをロードできません)。

私が読んで経験したことから、バンドラーは 1 つの Gemfile (この場合、親アプリのルートにあるもの) のみをロードします。I のときに、下位のディレクトリにある他の Gemfile を評価するハックを見てきましたbundle installが、Gemfile 全体に同じ gem があり、すべて親の Gemfile に動的に書き込まれている場合、これはしばしば壊れます。

なしで unicorn を実行しようとするとbundle exec、あるマシンでは動作するように見えますが、他のマシンでは動作しないようです。これは、gem バイナリが特定の Gemfile にリストされているものにロックされていないためだと推測しています。現在のrvm環境でgemのみをロードして、特定のgemsetのすべてのgemを利用できるようにするか(この場合、これが理想的です)、それともグローバルに利用可能な他のgemを利用できるようにするのでしょうか。これに関する説明は役に立ちます。

私の質問は、親ラック アプリからユニコーンを起動したい場合、マウントされたアプリケーションの Gemfile で使用されるすべての gem を親ラック アプリの Gemfile にリストする必要があるかどうかです。bundler/setup ; Bundler.require(:default)または、マウントされたアプリケーションの config.ru/application.rb ファイルごとに、新しい Gemfile ( ) を割り当てるなど、何らかの追加の構成を行う必要がありますENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)か?

最初のアプローチは、一度に 2 つの Gemfiles を変更する必要があるため、適切な苦痛のように思えます。しかし、2番目のアプローチを機能させることができません。

または、複数のラック アプリケーションを個別に開発し、それらすべてを単一のラックアップにマウントしようとすることについて、私が見ていない基本的なことはありますか?

4

1 に答える 1