Инженеры из компании Facebook анонсировали новый открытый инструмент Watchman, в рамках которого создан сервис для отслеживания изменения и поиска файлов в заданных иерархиях директорий. При обнаружении факта изменения содержимого файла Watchman позволяет выполнить определённое пользователем событие, привязанное к типу файла и характеру изменений.
Несмотря на то, что подобные возможности могут найти достаточно широкую область применений, основной целью разработки является ускорение работы системы сборки больших проектов, в которых Watchman может быть использован для автоматизации пересборки ресурсов, связанных с файлом для которого зафиксировано изменение. Код проекта написан на языке Си и распространяется под лицензией Apache 2.0. Программой поддерживается широкий спектр средств отслеживания изменений в файловой системе: inotify в Linux, kqueue в Mac OS X, FreeBSD 9.1 и OpenBSD, port_create в Illumos и Solaris.
Watchman поддерживает рекурсивный мониторинг изменений в произвольном числе директорий, отслеживая всю иерархию от текущей директории до конечных ветвей дерева. Перед инициирования действия и запуска связанной с ним команды система дожидается завершения изменения и закрытия файла. Серверный и клиентский интерфейс реализован в рамках единого исполняемого файла watchman, поддерживающего как управление из командной строки так и работу в виде сервиса, обрабатывающего запросы в формате JSON.
Допускается создание достаточно сложных фильтров, определяющих правила выбора файлов для привязки к действиям. Возможно определение исключений, учёт времени изменения, использование регулярных выражений PCRE и логических операторов, задание таймаута перед запуском команды. Watchman также поддерживает большинство возможностей утилиты find, но отличается тем, что осуществляет выборку по предварительно сформированному индексу, без перебора содержимого всей иерархии директорий на каждый запрос. Также поддерживается работа в режиме накопления лога изменений содержимого файловой системы. Кроме запуска приложений для выполнения действий поддерживается организация взаимодействия через систему подписки на изменения, при котором внешняя программа открывает сокет и ждёт поступления сигналов о наличии изменений.
Простейший пример использования сервиса выглядит следующим образом:
Запускаем мониторинг директории ~/src:
$ watchman watch ~/src
Указываем о необходимости запуска программы buildme при изменении CSS-файлов (путь к файлу передаётся в качестве аргумента при запуске buildme):
$ watchman -- trigger ~/src buildme '*.css' -- minify-css