3

Railsアプリのバンドラーによって単一のgemがロードされず、本番環境でのみロードされるという問題があります-開発モードでgemを使用しても問題はありません。

gem はcountry_selectで、バージョン 1.1.3 と github リポジトリで試しました。アプリは Rails 3.2.11 を使用しています。

gem がサーバー上に存在することの証明

gem は、バンドラーによって本番環境に正常にインストールされます。

$ RAILS_ENV=production bundle install
...
Using coffee-rails (3.2.2)
Using country_select (1.1.3)
Using daemons (1.1.9)
...
Your bundle is complete! It was installed into /home/deploy/rails-app/shared/bundle

gem は、バンドラーがインストールする共有 gem ディレクトリに表示されます。

$ ls -al /home/deploy/rails-app/shared/bundle/ruby/1.9.1/gems/ | grep country
drwxrwxr-x  3 deploy deploy 4096 Apr  3 08:49 country_select-1.1.3

コンソールからレールを起動すると、gem が読み込まれます。

$ RAILS_ENV=production script/rails c
Loading production environment (Rails 3.2.11)
irb(main):002:0> Gem.loaded_specs.keys.grep /country/
=> ["country_select"]

でも...

country_selectRails アプリでの宝石の同じチェックは失敗します。例えば:

class ApplicationController < ActionController::Base

  before_filter do
    raise Gem.loaded_specs.keys.grep(/country/).inspect
  end

  #...
end

吐き出し[]ます - つまり、gem はロードされません。さらに、gem に依存するアプリケーションの一部は、gem が存在しないために失敗します。

そして最後に、質問

スタートアップのどこかにを追加するだけrequire 'country_select'で、gem が読み込まれ、アプリが動作します。しかし、bundler が特定の gem をインストールしてアプリの gem ディレクトリに追加しているにもかかわらず、なぜ bundler はその特定の gem でそれを行わないのでしょうか?

本番環境に関する詳細情報:

$ rvm -v
rvm 1.18.18 (stable)...
$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
$ gem -v
1.8.25
$ bundle -v
Bundler version 1.3.2

更新: 2013 年 4 月 5 日

問題は「なくなった」ようです。数回の再展開の後、機能しているように見えます。これは、country_select gem が変更されていないにもかかわらず、非常に奇妙です。その間に何が変わったのかを正確に調べていますが、困惑しています。

4

2 に答える 2

0

走ってみてください

RAILS_ENV=production bundle exec script/rails c
于 2013-04-04T01:00:10.830 に答える
-1

同じバージョンを使用するアプリがあり、開発または運用で宝石を必要とする必要はありません。私もあなたbefore_filterと試してみましたが["country_select"]、期待どおりになりました。したがって、問題は宝石にはありません。

どこかの初期化でロードされた宝石をいじっているのか(ありそうもない)、サーバーの周りのセットアップに問題があると思います。でサーバーを起動していますRAILS_ENV=production bundle exec script/rails serverか? サーバーで使用されている gem パスに、質問で言及した共有 gem パスが含まれていることを確認できますか?

于 2013-04-05T10:52:29.247 に答える