プログラムの実行時に Ruby が開いた現在のファイルをすべて検索します
概要
これは難解なリクエストであり、私にとっては理論的に興味深いだけです (つまり、実稼働コードではこれを使用しません)。 Ruby プログラムの実行時に関連するすべてのファイルを把握することが可能かどうか知りたいです。つまり、そのプログラムが実行中に必要とするファイル (または、プログラムの途中で Rails によって自動ロードされるなど、何らかの方法で実行されるファイル)。
ObjectSpace を使用して、File とその子孫を除くすべてのオブジェクトをループできることはわかっています。また、ガベージ コレクションを無効にすると、この方法で部分的に成功しました (当然のことですが、そうでない場合は、リストがランダムに縮小します)。ただし、プログラムの開始時にこれを実行すると、プログラムの途中で必要なファイルが無視されるため、最後に同じコードを実行して、これらのファイルの結合を取得できます。
解決策
私も数か月前にまったく同じことをしました。これが私の汚いプログラムです:
REQUIRE_FILE = ENV.fetch('REQUIRE_FILE', '/tmp/requires.txt')
File.open(REQUIRE_FILE, 'w')
Kernel.module_eval do
alias_method :require_without_benchmark, :require
def require(name)
start = Time.now
begin
require_without_benchmark(name)
ensure
time = Time.now - start
File.write(REQUIRE_FILE, [name, time.to_f].join(',').concat("\n"), mode: 'a')
end
end
end
次に、プログラムを次のように実行します。
ruby -r ./require-benchmark.rb program.rb