Techioz Blog

プログラムの実行時に 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