完全なシーケンスを追跡するにはどうすればよいですか。 Rubyアプリケーションでの「必須」の順序はツリーですか?
-
06-07-2019 - |
質問
Rubyアプリで発生する「必須」の階層をどのように表示できますか?
一部のファイルには、追加のファイルが必要なファイルが必要です。
ただし、デバッグモードでアプリケーションを実行すると、必要なファイルのサブセットのみがトリガーされます。特定の時点でアプリケーションが使用している機能のサブセットで使用されるファイルのみがトリガーされます。
アプリケーションのすべての要件の包括的な階層をツリーとして表示するにはどうすればよいですか
解決
問題は、開発モードでは、すべてのファイルが require
ではなく load
でロードされるため、リクエストごとにリロードできることです。本番環境では、それらは一度だけロードされます。一部のフレームワーククラスを除き、ほとんどのファイルは、最初に使用されたときにのみロードされます。これは、ActiveSupportがconst_missingをオーバーライドして、適切な命名スキーム( ConstantName.to_s.underscore
で require 'constant_name'
を指定したファイルから未知の定数を自動的にロードしようとするためです。もちろん、これは「必須」階層を本当に混乱させます。
些細なケースでは、ニーズの一部に合わせて以下を変更できます(active_supportの依存関係も確認してください)
$require_level = []
alias :orig_require :require
def require(file)
puts "#{$require_level.join}#{file}"
$require_level << "-"
r = orig_require(file)
$require_level.pop
r
end
require 'foo'
require 'baz'
ben@legba-2:~ $ ruby check_requires.rb
foo
-bar
baz
幸運
編集:説明
それは、ネストレベルのrequireを格納するためのグローバル配列を作成することです。最初のputsは必要なファイルを出力します。次に、ダッシュがネストレベルに追加されます。このファイルは実際に必要です。ロードされたファイルの呼び出しが必要な場合、ネストレベルが1深いので&quot;-#{file}&quot;を除き、このプロセス全体が再び開始されます。置かれます。このプロセスは、ネストレベルが大きくなるまで繰り返されますが、ダッシュも同様です。ファイルとそのすべての依存関係が読み込まれた後、requireは、ネストレベルがrequireの開始時と同じ状態になるように、追加したダッシュを削除します。これにより、ツリー構造が正確に保たれます。
const_missingはmethod_missingに似ています。基本的に、 AnObject.some_unknown_method
を呼び出すときと同じように、RubyはNoMethodErrorを発生させる前に AnObject.method_missing(:some_unknown_method)
を呼び出し、SomeUnknownConstantを使用して const_missing(:SomeUnknownConstantをトリガーします)
を使用して、NameErrorを発生させます。 Railsはconst_missingを定義して、欠落している定数を定義する可能性のあるファイルの特定の指定されたパスを検索します。これを容易にするために命名規則を使用します。 SomeUnknownConstant
は some_unknown_constant.rb
このRailsの狂気の多くには方法があります。