24

require2 回目にファイルを強制的に実行する方法はありますか?

Ruby のパスにあるライブラリを作成しています。IRB で簡単なテストを行いながらファイルを編集しています。

ファイルに変更を加えるたびに、IRB セッションを終了せずに再読み込みしたいと考えています。を使用loadするには、ファイルへのパス全体を毎回入力する必要があり、IRB を毎回再起動するには、単純なテストに必要な他のすべての変数設定を入力する必要があります。

私はただのようなものが欲しいのですrequireが、それは二度目のロードを可能にします。それを行う簡単な方法はありますか?

4

3 に答える 3

32

load(うーん) フルパスは必要ありません。拡張子付きの完全なファイル名が必要です。

p load 'date.rb' #=> true
p load 'date.rb' #=> true
p load 'date'    #=> LoadError
于 2012-04-24T21:05:01.307 に答える
4

自分で書いて .irbrc に入れることができます:

新しい辛さ

module Kernel
  def reload(lib)
    if old = $LOADED_FEATURES.find{|path| path=~/#{Regexp.escape lib}(\.rb)?\z/ }
      load old
    else
      require lib
    end
  end
end

数分経過したため、破棄されました

module Kernel
  # Untested
  def reload(lib)
    if File.exist?(lib)
      load lib
    else
      lib = "#{lib}.rb" unless File.extname(lib)=='.rb'
      $:.each do |dir|
        path = File.join(dir,lib)
        return load(path) if File.exist?(path)
      end
    end
  end
end

RubyGems をサポートしたい場合は、古いバージョンをより堅牢にする必要があります。

これらのソリューションのいずれかの問題の 1 つは、問題のファイルを強制的にリロードしますが、そのファイルが他のファイルを呼び出すrequire場合 (通常は gem の場合)、それらのファイルがリロードされないことです。

これを回避するのは本当に醜いでしょう。同様に、おそらく手動で$LOADED_FEATURES配列に到達し、gem の名前に関連していると思われるすべてのパスを取り除きます。身震い

于 2012-04-24T22:34:10.403 に答える
4
:000> path = "extremely/long/path/to/my/file"
:001> load path
:002> load path
于 2012-04-24T21:01:20.247 に答える