2

rails サーバーを実行すると、guard/listen gem は完璧に機能します。ファイルの変更をリッスンし、変更があればあらゆる種類のスクリプトを実行します。しかし、レールコンソールを実行すると機能しません。

config/initializers/listen.rb にあるコードは次のとおりです。

Thread.new do
    puts "listening to changes in db/data directory"
    File.open("db/data/test.txt", 'a+'){ |f| f.puts "hello"} 
    Listen.to("db/data", :filter => /\.yml$/, :ignore => %r{ignored/path/}) do |modified, added, removed|
        File.open("db/data/test.txt", 'a+'){ |f| f.puts "file changed"} 
        puts "file changed"
    end
end

Rails コンソールを実行すると、"listening to changes in db/data directory" という行が出力され、停止します。

マルチスレッドとブロッキングに関係があると思います。

コンソールでリッスンを実行する方法はありますか?

ありがとう、ミハル・ヤシュペ

4

2 に答える 2

0

List.to ブロックは、Listen.to が呼び出された後に変更が行われるまで呼び出されません。Listen が変更イベントを発生させる前後に、ファイルを変更しようとしています。

「変更されたファイル」を Thread.new の外側に移動します。

 Thread.new do
      puts "listening to changes in db/data directory"

      Listen.to("db/data", :filter => /\.yml$/) do |modified, added, removed|
        File.open("db/data/test.txt", 'a+'){ |f| f.puts "file changed"} 
        puts "file changed"
      end
  end
File.open("db/data/test.txt", 'w+'){ |f| f.puts "changed now"}

コールバック メソッドも試して、スレッドを削除してください: https://github.com/guard/listen#changes-callback

于 2012-12-07T22:40:57.413 に答える