Заставить FSSM gem (File Watcher) делать это для всех файлов при загрузке - PullRequest
1 голос
/ 07 февраля 2011

У меня есть простой FSSM (Монитор состояния файловой системы) установки сценария для просмотра некоторых файлов и выполнения некоторых операций с ними при их изменении.Это прекрасно.

Однако я хочу, чтобы он обрабатывал любые файлы, для которых у него есть обработчик обновлений, когда я загружаю свой скрипт.Как и сейчас, если я внесу изменения в файлы перед запуском скрипта, мои изменения не будут получены, пока я снова не сохраню файл.И в проекте, где просматриваются десятки файлов, это далеко не идеально.

Итак, как заставить 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

Я бы хотел, чтобы он запускал условие обновления при запуске, чтобы любые файлы, отредактированные во время их просмотра, сразу же обрабатывались.

1 Ответ

1 голос
/ 05 апреля 2011

Простейшим методом, вероятно, будет обновление временной метки нулевого байта файла при каждом вызове предложения update, а затем при запуске любые файлы, которые новее этого файла маркера. Поскольку условие обновления необходимо будет использовать в двух местах, сохраните его как лямбда.

# 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, поэтому для этого может быть более понятный или более идиоматический синтаксис, но основная идея должна позаботиться о вас.

...