Rails detect changes to files programatically

一曲冷凌霜 提交于 2019-12-13 17:17:09

问题


I would like to write a method that programatically detects whether any of the files in my rails app have been changed. Is it possible do do something like an MD5 of the whole app and store that in a session variable?

This is mostly for having some fun with cache manifest. I already have a dynamically generated cache and it works well in production. But in my dev environment, I would like the id of that cache to update whenever I change anything in the app directory (as opposed to every 10 seconds, which is how I have it setup right now).

Update

File.ctime(".") would be perfect, except that "." is not marked as having changed when deeper directory files have changed.

Does it make sense to iterate through all directories in "." and add together the ctimes for each?


回答1:


Have you considered using Guard.

You can programatically do anything whenever a file in your project changes.

There is a nice railscast about it




回答2:


There is a simple ruby gem called filewatcher. This is the most advanced example:

require 'filewatcher'

FileWatcher.new(["README.rdoc"]).watch() do |filename, event|
  if(event == :changed)
    puts "File updated: " + filename
  end
  if(event == :delete)
    puts "File deleted: " + filename
  end
  if(event == :new)
    puts "New file: " + filename
  end
end



回答3:


File.ctime is the key. Iterate through all files and create a unique id based on the sum of all their ctimes:

cache_id = 0
Dir.glob('./**/*') do |this_file|
   ignore_files = ['.', '..', "log"]
   ignore_files.each do |ig|
       next if this_file == ig
   end
   cache_id += File.ctime(this_file).to_i if File.directory?(this_file)
end

Works like a charm, page only re-caches when it needs to, even in development.



来源:https://stackoverflow.com/questions/6914259/rails-detect-changes-to-files-programatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!