nitrile watch

This command watches the source and test directories and runs user-configurable commands when changes are detected.

This command requires Watchman to be installed.


Optional dependencies are treated as required. This means that all dependencies must be installed, and that nitrile watch will trigger commands when a file changes in any of the dependencies, even if that dependency is optional and not required for the triggered command.


There is no guarantee that all commands in a sequence will be executed. For efficiency reasons, Nitrile will check if changes have been detected after every command in the sequence. If changes have been detected, the rest of the commands will not be executed and the sequence will be restarted.


This command is not heavily tested on Windows, and Watchman is currently in beta on Windows.

Which changes are detected?

Nitrile will detect changes to files in the following directories:


  • compiler-generated files: *.abc; *.bc; *.o; *.obj; *.pbc; *.tcl;
  • any target of clm builds;
  • temporary files used by Vim’s writebackup: *.dcl~; *.icl~.

Also, the watch:exclude setting in nitrile.yml may be used to exclude more files.

For local dependencies, only the src and extra_src fields are included, and src fields of clm_options are excluded.


The commands to be run when changes are detected can be specified with --do. Any Nitrile subcommand (except watch itself) can be used, although it is most sensible to use commands like build, test, and generate-tags. For example:

nitrile watch --do build

This option may be given multiple times:

nitrile watch --do generate-tags --do build

If any --do action fails, the remaining actions will not be executed. However, Nitrile will continue to watch the source directory and restart the sequence on changes.

Subcommand arguments

Subcommands may have arguments:

nitrile watch --do build --only=main

The behaviour with global options requires some explanation. When global options are used before the first --do, they apply to all subcommands. The following command builds and runs tests for X86:

nitrile --arch=x86 watch --do build --do test

It is also possible to use global options for one particular subcommand. The following first builds for X86-64, then for X86:

nitrile watch --do build --arch=x64 --do build --arch=x86

Shell subcommands

You can also specify shell commands to be run. On Windows, these commands run in PowerShell; on other systems, in /bin/sh.

nitrile watch --do build --do shell ./bin/main

Shell commands can be made ‘cancellable’ with -c. This is meant for programs that do not terminate (or may run for a long time), such as servers. When a command is cancellable, Nitrile will continue to watch for changes in the background. When changes are detected, the shell command is terminated and all commands in the chain are restarted:

nitrile watch --do build --do shell -c ./bin/main