Ruby アプリで発生する「require」の階層をどのように表示できますか?
一部のファイルには、追加のファイルを必要とするファイルが必要です。
ただし、アプリケーションをデバッグ モードで実行すると、必要なファイルのサブセットのみがトリガーされます。つまり、特定の時点でアプリケーションが使用している機能のサブセットによって使用されるファイルのみがトリガーされます。
アプリケーション内のすべての要件の包括的な階層をツリーとして表示するにはどうすればよいでしょうか?
Ruby アプリで発生する「require」の階層をどのように表示できますか?
一部のファイルには、追加のファイルを必要とするファイルが必要です。
ただし、アプリケーションをデバッグ モードで実行すると、必要なファイルのサブセットのみがトリガーされます。つまり、特定の時点でアプリケーションが使用している機能のサブセットによって使用されるファイルのみがトリガーされます。
アプリケーション内のすべての要件の包括的な階層をツリーとして表示するにはどうすればよいでしょうか?
問題は、開発モードでは、すべてのファイルが、リクエストごとに再ロードできるようにするのload
ではなく、でロードされることです。require
本番環境では、それらは1回だけロードされます。一部のフレームワーククラスを除いて、ほとんどのファイルは、最初に使用されたときにのみロードされます。これは、ActiveSupportがconst_missingをオーバーライドして、適切な命名スキーム(ConstantName.to_s.underscore
を与えるrequire 'constant_name'
)を使用してファイルから不明な定数を自動的にロードしようとするために発生します。もちろん、これは「require」階層を実際に混乱させます。
些細なケースでは、ニーズの一部を満たすために以下を変更できます(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
幸運を
編集:説明
これは、requiresのネストレベルを格納するためのグローバル配列を作成することです。最初のputsは、必要なファイルを出力します。次に、ネストレベルにダッシュが追加されます。その場合、ファイルは実際に必要になります。ロードされたファイル呼び出しが必要な場合、ネストレベルが1の深さであるため、「-#{file}」が配置されることを除いて、このプロセス全体が再開されます。このプロセスは、ネストレベルが大きくなる場合を除いて繰り返されるため、ダッシュも同様です。ファイルとそのすべての依存関係がロードされた後、requireは追加されたダッシュを外して、ネストレベルがrequireが開始されたときと同じ状態になるようにします。これにより、ツリー構造が正確に保たれます。
const_missingはmethod_missingに似ています。基本的に、AnObject.some_unknown_method
rubyを呼び出すときにNoMethodErrorを発生させる前に呼び出すのと同様にAnObject.method_missing(:some_unknown_method)
、SomeUnknownConstantを使用すると、NameErrorを発生させるconst_missing(:SomeUnknownConstant)
前にaがトリガーされます。Railsは、欠落している定数を定義する可能性のあるファイルを特定の指定されたパスで検索するようにconst_missingを定義します。これを容易にするために命名規則を使用SomeUnknownConstant
します。some_unknown_constant.rb
このレールの狂気の多くに方法があります。