2

当我运行 rails server 时,guard/listen gem 可以完美运行 - 它会监听文件中的更改并在发生更改时运行各种脚本。但是 - 当我运行 rails 控制台时它不起作用。

这是 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 控制台时,它会打印“监听 db/data 目录中的更改”行并停止。

我认为这与多线程和阻塞有关。

有没有办法用控制台运行监听?

谢谢,米哈尔·亚什佩

4

2 回答 2

1

我知道这是一个老问题,但我会为任何寻找这个的人提供答案。它会停止还是退出?无论如何,它应该退出......

当您启动 Rails 应用程序时,它不会退出,这就是它起作用的原因,正如 Matt 所说,listen gem 在调用 Listen.to 之后调用该块。当您从 rails 控制台启动脚本时,它会简单地执行所有内容然后退出。您需要在末尾添加 asleep或 agets以确保您的脚本永远不会退出。

于 2015-08-03T15:20:26.853 回答
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 回答