Executes commands in response to file modifications
Go to file
Félix Saparelli 1f3f4ada35 Split into two crates: lib and cli
That has a number of advantages:

- #193 the build.rs is only run for the CLI, so the Windows manifest is
  not embedded in the library anymore, opening it up for downstreams.

- it sets the stage for decoupling the version numbers of the CLI and
  library, to have the library increase its major more often, while the
  CLI retains compatibility further… that is, to have both follow semver

- it removes the CLI-only dependencies from the library

- it makes compilation a bit faster as compiling the library and the
  CLI's other dependencies can happen in parallel

One major disadvantage:

- installing via cargo changes from watchexec to watchexec-cli. Most
  installs are from prebuilt and from packages, but that's still a
  potential stumble.

And of course, the CLI APIs in the library are gone (they were already
deprecated, though).

We also take this opportunity to get rid of the clear_screen code and
use our new clearscreen library. #99 #171 #185
2021-05-01 03:27:17 +12:00
.github/workflows Add experimental builds for WinARM 2021-05-01 02:26:33 +12:00
bin Split into two crates: lib and cli 2021-05-01 03:27:17 +12:00
cli Split into two crates: lib and cli 2021-05-01 03:27:17 +12:00
completions Drop debounce to 150ms (#168) 2021-04-11 06:05:28 +12:00
doc Add logo 2021-04-26 23:59:43 +12:00
lib Split into two crates: lib and cli 2021-05-01 03:27:17 +12:00
test Remask received signal after re-raising it 2016-12-15 09:41:10 -05:00
.editorconfig Remove appveyor 2019-10-28 13:11:33 +13:00
.gitignore Install rustup target for musl 2018-08-21 16:28:42 +12:00
CONTRIBUTING.md Switch to gh actions and clean up metadata and build stuff 2021-04-10 23:53:12 +12:00
Cargo.lock Split into two crates: lib and cli 2021-05-01 03:27:17 +12:00
Cargo.toml Split into two crates: lib and cli 2021-05-01 03:27:17 +12:00
LICENSE Create LICENSE 2016-09-18 16:43:26 -04:00
README.md Split into two crates: lib and cli 2021-05-01 03:27:17 +12:00

README.md

watchexec

CI status Crates.io status Docs 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 and .ignore 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 the command in a new process group
  • Sets the following environment variables in the process:
    • If a single file changed (depending on the event type):
      • $WATCHEXEC_CREATED_PATH, the path of the file that was created
      • $WATCHEXEC_REMOVED_PATH, the path of the file that was removed
      • $WATCHEXEC_RENAMED_PATH, the path of the file that was renamed
      • $WATCHEXEC_WRITTEN_PATH, the path of the file that was modified
      • $WATCHEXEC_META_CHANGED_PATH, the path of the file whose metadata changed
    • If multiple files changed:
      • $WATCHEXEC_COMMON_PATH, the longest common path of all of the files that triggered a change
    • This can be disabled or limited with --no-environment and --no-meta
  • 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 command:

$ watchexec -r -s SIGKILL my_server

Send a SIGHUP to the command upon changes (Note: using -n 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

Run bundle install when the Gemfile changes:

$ watchexec -w Gemfile bundle install

Run two commands:

$ watchexec 'date; make'

If you come from entr, note that the watchexec command is run in a shell by default. You can use -n or --shell=none to not do that:

$ watchexec -n -- echo ';' lorem ipsum

On Windows, you may prefer to use Powershell:

$ watchexec --shell=powershell -- test-connection localhost

Installation

All platforms

Cargo

Requires Rust 1.43 or later.

$ cargo install watchexec-cli

Binstall

$ cargo binstall watchexec-cli

Pre-built

Use the GitHub Releases tab to obtain the tarball/zipfile appropriate for your platform and architecture, extract it, and place it in your PATH.

macOS

Homebrew

$ brew install watchexec

Webi

$ curl -sS https://webinstall.dev/watchexec | bash

Linux

PRs for packaging in unsupported distros are welcome.

Debian

A deb package is available for several architectures in the GitHub Releases.

Arch Linux

Available in the community repository:

$ pacman -S watchexec

Webi

$ curl -sS https://webinstall.dev/watchexec/ | bash

Windows

Scoop

#> scoop install watchexec

Chocolatey

#> choco install watchexec

Webi

#> curl.exe -A MS https://webinstall.dev/watchexec | powershell

Shell completions

Currently available shell completions:

  • zsh: completions/zsh should be installed to /usr/share/zsh/site-functions/_watchexec

Credits

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