58

Rails load_paths に関する投稿を読みました。ここにリンクがあります。

しかし、私はまだ と の違いについて混乱していautoload_pathsますeager_load_paths:

新しく作成した Rails 4 プロジェクトでそれらをテストしました。開発モードでは自動リロードしますが、本番モードでは同じように実行されるようです。

4

2 に答える 2

198

ここにリンクされた記事の著者。これは、@ fkreuschの回答から外れて、混乱を解消する試みです。

Ruby では、コードを実行するためにすべての.rbファイルを要求する必要があります。ただし、Rails では、ディレクトリ内のモデル、コントローラー、またはその他のファイルを特に必要としないことに注意してくださいapp/。何故ですか?それは in Railsapp/*が inだからautoload_pathsです。つまり、Rails アプリを開発中に (たとえば を介してrails console) 実行する場合、モデルやコントローラーはまだ実際には Ruby で必要とされていません。BookRails は ruby​​ の特別な魔法の機能を使用して、コードが定数 (たとえば) に言及するまで実際に待機しrequire 'book'ますautoload_paths。これにより、開発中のコンソールとサーバーの起動が高速になります。コードが実際に必要な場合にのみ、起動時に何も必要ないためです。

さて、この動作はローカル開発には適していますが、本番環境ではどうでしょうか? 本番環境で、サーバーが同じタイプの魔法のような一定の読み込み (自動読み込み) を行うと想像してください。実際には世界の終わりではありません。本番環境でサーバーを起動すると、一部のファイルを自動ロードする必要があるため、ページの閲覧が少し遅くなります。はい、サーバーが「ウォームアップ」している間、これらのいくつかの初期リクエストでは遅くなりますが、それほど悪くはありません. ただし、これで話は終わりではありません。

Ruby 1.9.x で実行している場合 (私の記憶が正しければ)、そのような自動要求ファイルはスレッドセーフではありません。そのため、puma のようなサーバーを使用している場合、問題が発生します。マルチスレッド サーバーを使用していない場合でも、起動時にアプリケーション全体を「積極的に」要求する方がよいでしょう。これは、本番環境では、アプリを起動するときにすべてのモデル、すべてのコントローラーなどをすべて完全に必要とし、起動時間が長くなっても気にしないことを意味します。これは熱心な読み込みと呼ばれます。ruby ファイルはすべて熱心に読み込まれますね。requireしかし、Rails アプリにステートメントが 1 つもない場合、どうすればそれができるでしょうか? そこがeager_load_pathsそれらに何を入れても、それらのパスの下にあるすべてのディレクトリ内のすべてのファイルが、本番環境の起動時に必要になります。これで解決することを願っています。

は開発環境ではアクティブではないことに注意することが重要eager_load_pathsです。そのため、それらに入れたものは、開発ですぐに必要になるわけではなく、本番環境でのみ必要になります。

また、何かを入れるだけautoload_pathsでは本番環境で熱心に読み込まれるわけではないことに注意することも重要です。不運にも。それも明示的に入れる必要がeager_load_pathsあります。

もう 1 つの興味深い癖は、すべての Rails アプリで、下にあるすべてのディレクトリapp/が自動的に と の両方autoload_pathseager_load_pathsあることです。つまり、そこにディレクトリを追加しても、それ以上の操作は必要ありません。

于 2013-11-08T06:24:39.870 に答える
11

基本的にautoload_pathsは、Rails がクラスを自動的にロードするために使用するパスです。たとえば、 を呼び出したときにBook、そのクラスがまだロードされていない場合は、 を通過しautoload_pathsてそれらのパスで検索します。

本番環境では、自動ロードの同時実行の問題を回避するために、これらを事前にロードする方がよい場合があります。そのために、 を提供しeager_load_pathsます。そのリスト内のパスは、アプリケーションの開始時に事前に必要になります。

于 2013-11-04T17:43:58.870 に答える