Просмотр каталога в рубине
У нас есть приложение, которое должно обрабатывать входящие файлы, которые удаляются в каталог.
Я ищу лучший способ сделать это.
Мы используем цикл Backgroundrb process, но, если честно, Backgroundrb ненадежен, и мы хотели бы отойти от него, если это возможно.
Delayed_job, похоже, не для текущих задач, а для одного выхода.
Я нашел DirectoryWatcher http://codeforpeople.rubyforge.org/directory_watcher/, который выглядит многообещающим, но в идеале мы хотим иметь некоторый контроль над этим, а также иметь возможность контролировать если оно вверх или нет.
Таким образом, требования:
- run forever
- обрабатывать файлы в порядке
- можно отслеживать
- есть способ перезапустить его и обеспечить его (Бог?)
Спасибо за любой вклад! Это не должно быть сложно, и я удивлен, что не могу найти кого-то другого, говорящего об этом в Интернете, поскольку я бы подумал, что в бизнес-приложениях это было не редкость.
Ответы
Ответ 1
И там также guard:
Guard автоматизирует различные задачи, запуская пользовательские правила всякий раз, когда изменяется файл или каталоги.
Он часто используется разработчиками программного обеспечения, веб-дизайнерами, писателями и другими специалистами, чтобы избежать мирских, повторяющихся действий и команд, таких как "перезапуск" инструментов после смены исходных файлов или конфигураций.
Общие варианты использования включают в себя: замену IDE, инструменты для веб-разработки, разработку "интеллектуальных" и "отзывчивых" систем сборки/рабочих процессов, автоматизацию различных задач проекта и установку/мониторинг различных системных служб...
Ответ 2
Спасибо @emerge, как относительный новичок в рельсах, я хотел посмотреть файлы в моем приложении Rails, а не в командной строке. По сравнению с другими вариантами здесь обнаружилось, что Listen было невероятно простым шагом:
-
Добавлено это в файл gem:
gem 'listen', '~> 2.0'
-
Затем добавлено это в Application.rb для запуска при запуске приложения:
listener = Listen.to('public/json_import') do |added|
puts "added absolute path: #{added}"
end
listener.start # not blocking
Мы также можем прослушивать несколько dirs, а также изменять/добавлять/удалять:
listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed|
Ответ 3
Там также крошечный файлообменник rubygem. Драгоценный камень не имеет зависимостей, не содержит кода, специфичного для платформы, и просто обнаруживает обновления, переходы и добавления путем опроса.
require 'filewatcher'
FileWatcher.new(["directory"]).watch() do |filename, event|
if(event == :changed)
puts "File updated: " + filename
end
if(event == :delete)
puts "File deleted: " + filename
end
if(event == :new)
puts "Added file: " + filename
end
end
Ответ 4
Три варианта старой школы, о которых я знаю:
Ara T. Howard DirWatch:
Мой собственный DirectoryWatcher:
Пол Хорман FileSystemWatcher:
Ответ 5
https://github.com/mynyml/watchr
Это обычно используется для запуска unit test автоматически, но также должно соответствовать вашим потребностям.
Ответ 6
Я думаю, https://github.com/nex3/rb-inotify должен работать на вас.
Пример использования этого драгоценного камня
require 'rb-inotify'
notifier = INotify::Notifier.new
notifier.watch("/tmp", :moved_to, :create) do |event|
puts "#{event.absolute_name} is now in path /tmp!"
end
notifier.run