Executes commands in response to file modifications
Find a file
Matt Green f4774d6f8c 1.8.3
2017-04-27 15:40:00 -04:00
ci Package man page and LICENSE with executable 2016-10-29 13:16:31 -04:00
doc add docs for no-default-ignore 2017-04-25 21:17:46 -04:00
pkg/brew Update brew formula 2016-11-08 21:53:13 -05:00
src Ensure correct path separators are used for VCS ignore dirs 2017-04-27 15:39:12 -04:00
test Remask received signal after re-raising it 2016-12-15 09:41:10 -05:00
.gitignore Cargo.lock should be committed for apps 2016-10-13 20:26:32 -04:00
.travis.yml CI: try stable Rust release 2016-11-15 17:16:40 -05:00
appveyor.yml CI: Use stable channel on AppVeyor 2016-11-15 17:19:15 -05:00
Cargo.lock 1.8.3 2017-04-27 15:40:00 -04:00
Cargo.toml 1.8.3 2017-04-27 15:40:00 -04:00
LICENSE Create LICENSE 2016-09-18 16:43:26 -04:00
Makefile Fix atrocious spacing in Makefile 2017-02-07 10:30:47 -05:00
README.md Note that Rust 1.15 is required 2017-04-17 12:52:46 -04:00

watchexec

Build Status Build status Crates.io status

Software development often involves running the same commands over and over. Boring!

watchexec is a simple, standalone tool that watches a path and runs a command whenever it detects modifications.

Example use cases:

  • Automatically run unit tests
  • Run linters/syntax checkers

Features

  • Simple invocation and use
  • Runs on OS X, Linux and Windows
  • Monitors current directory and all subdirectories for changes
    • Uses most efficient event polling mechanism for your platform (except for BSD)
  • Coalesces multiple filesystem events into one, for editors that use swap/backup files during saving
  • By default, uses .gitignore to determine which files to ignore notifications for
  • Support for watching files with a specific extension
  • Support for filtering/ignoring events based on glob patterns
  • Launches child processes in a new process group
  • Sets the following environment variables in the child process:
    • $WATCHEXEC_UPDATED_PATH the path of the first file that triggered a change
    • $WATCHEXEC_COMMON_PATH the longest common path of all of the files that triggered a change
  • Optionally clears screen between executions
  • Optionally restarts the command with every modification (good for servers)
  • Does not require a language runtime

Anti-Features

  • Not tied to any particular language or ecosystem
  • Does not require a cryptic command line involving xargs

Usage Examples

Watch all JavaScript, CSS and HTML files in the current directory and all subdirectories for changes, running make when a change is detected:

$ watchexec --exts js,css,html make

Call make test when any file changes in this directory/subdirectory, except for everything below target:

$ watchexec -i target make test

Call ls -la when any file changes in this directory/subdirectory:

$ watchexec -- ls -la

Call/restart python server.py when any Python file in the current directory (and all subdirectories) changes:

$ watchexec -e py -r python server.py

Call/restart my_server when any file in the current directory (and all subdirectories) changes, sending SIGKILL to stop the child process:

$ watchexec -r -s SIGKILL my_server

Send a SIGHUP to the child process upon changes (Note: with using -n | --no-shell here, we're executing my_server directly, instead of wrapping it in a shell:

$ watchexec -n -s SIGHUP my_server

Run make when any file changes, using the .gitignore file in the current directory to filter:

$ watchexec make

Run make when any file in lib or src changes:

$ watchexec -w lib -w src make

Installation

Cargo

watchexec requires Rust 1.15 or later. You can install it using cargo:

$ cargo install watchexec

OS X with Homebrew

$ brew install watchexec

Linux

For now, use the GitHub Releases tab to obtain the binary. PRs for packaging in various distros are welcomed.

Windows

Use the GitHub Releases tab to obtain the binary. In the future, I'll look at adding it to Chocolatey.

Building

Rust 1.15 or later is required.

Credits

  • notify for doing most of the heavy-lifting
  • globset for super-fast glob matching