2011-02-07 3 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

가장 간단한 방법은 update 절의 각 호출에서 0 바이트 파일의 타임 스탬프를 업데이트 한 다음 실행시 해당 마커 파일보다 새로운 파일을 처리하는 것입니다. update 절은 두 위치에서 사용해야하므로 람다 (lambda)로 저장하십시오.

 
# 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 

나는 루비에 비교적 새로운 해요, 그래서 청소기 이상의 숙어 구문이 거기에있을 수 있지만, 기본적인 아이디어는 당신의주의를 기울여야한다.

관련 문제