2011-02-07 1 views
1

単純なFSSM (File System State Monitor)スクリプト設定を使用して、一部のファイルを監視し、変更されたときにいくつかのことを行うようにしました。それは素晴らしいwokingです。起動時にFSSM gem(ファイルウォッチャー)をすべてのファイルに作成する

しかし、スクリプトを起動するときに更新ハンドラを持つファイルを処理する必要があります。今のように、スクリプトを開始する前にファイルを編集すると、ファイルを再度保存するまで編集内容が取得されません。数十のファイルが監視されているプロジェクトでは、それは理想的なものではありません。

どのようにFSSMは、スクリプトの起動時に監視するように設定されているすべてのファイルを処理しますか?

私が今持っているものの抜粋:

monitor = FSSM::Monitor.new 
monitor.path '.' do 
    glob '**/*.coffee' 

    update do |base, relative| 
    coffee base, relative 
    end 

    delete do |base, relative| 
    remove base, relative 
    end 
end 
monitor.run 

私は、彼らが見られていなかった間、編集したすべてのファイルがすぐに処理になるだろうように、それは起動時に更新句を実行したいと思います。

+0

ログファイルまたはsqliteデータベースを使用して、監視中のファイルの状態を保存することができます(ファイルが変更され、スクリプトが実行されるたびに更新されます)。実際の – jvatic

答えて

1

最も簡単な方法は、更新句を呼び出すたびにゼロバイトファイルのタイムスタンプを更新してから、起動時にそのマーカーファイルより新しいファイルを処理することです。更新句は2つの場所で使用する必要があるため、ラムダとして格納します。

 
# marker file 
ts = ".timestamp" 
File.open(ts,"w"){} unless File.exists? ts 


# store the update block, so we're DRY 
update_clause = lambda do |base, relative| 
     coffee base, relative 
     atime = mtime = Time.now 
     File.utime(atime, mtime, ts) 
end 

# run the update against any files newer than the timestamp file 
Dir["**/*.coffee"].each do |f| 
    if File.mtime(f) > File.mtime(ts) 
     update_clause.call(File.dirname(f), File.basename(f)) 
    end 
end 

monitor = FSSM::Monitor.new 
monitor.path '.' do 
    glob '**/*.coffee' 

    update &update_clause 

    delete do |base, relative| 
    remove base, relative 
    end 
end 
monitor.run 

私は、Rubyにかなり新しいですので、このためのクリーナー以上の慣用的な構文があるかもしれませんが、基本的な考え方は、あなたの世話をする必要があります。

関連する問題