Skip to content

Running Tasks

See available tasks with mise tasks. To show tasks hidden with property hide=true, use the option --hidden.

List dependencies of tasks with mise task deps [tasks]....

Run a task with mise task run, mise run, or just mise r. You might even want to make a shell alias like alias mr='mise run --' since this is likely a common command.

By default, tasks will execute with a maximum of 4 parallel jobs. Customize this with the --jobs option, jobs setting or MISE_JOBS environment variable. The output normally will be by line, prefixed with the task label. By printing line-by-line we avoid interleaving output from parallel executions. However, if --jobs == 1, the output will be set to interleave.

To just print stdout/stderr directly, use --interleave, the task_output setting, or MISE_TASK_OUTPUT=interleave.

Stdin is not read by default. To enable this, set raw = true on the task that needs it. This will prevent it running in parallel with any other task-a RWMutex will get a write lock in this case.

Extra arguments will be passed to the task, for example, if we want to run in release mode:

mise run build --release

If there are multiple commands, the args are only passed to the last command.

Multiple tasks/arguments can be separated with this ::: delimiter:

mise run build arg1 arg2 ::: test arg3 arg4

mise will run the task named "default" if no task is specified—and you've created one named "default". You can also alias a different task to "default".

mise run

Task Grouping

Tasks can be grouped semantically by using name prefixes separated with :s. For example all testing related tasks may begin with test:. Nested grouping can also be used to further refine groups and simplify pattern matching. For example running mise run test:**:local will matchtest:units:local, test:integration:local and test:e2e:happy:local (See Wildcards for more information).


Glob style wildcards are supported when running tasks or specifying tasks dependencies.

Available Wildcard Patterns:

  • ? matches any single character
  • * matches 0 or more characters
  • ** matches 0 or more groups
  • {glob1,glob2,...} matches any of the comma-separated glob patterns
  • [ab,...] matches any of the characters or ranges [a-z]
  • [!ab,...] matches any character not in the character set


mise run generate:{completions,docs:*}

And with dependencies:

[tasks."lint:eslint"] # using a ":" means we need to add quotes
run = "eslint ."
run = "prettier --check ."
depends = ["lint:*"]

Running on file changes

It's often handy to only execute a task if the files it uses changes. For example, we might only want to run cargo build if an ".rs" file changes. This can be done with the following config:

description = 'Build the CLI'
run = "cargo build"
sources = ['Cargo.toml', 'src/**/*.rs'] # skip running if these files haven't changed
outputs = ['target/debug/mycli']

Now if target/debug/mycli is newer than Cargo.toml or any ".rs" file, the task will be skipped. This uses last modified timestamps. It wouldn't be hard to add checksum support.

Watching files

Run a task when the source changes with mise watch:

mise watch -t build

Currently this just shells out to watchexec-which you can install however you want including with mise: mise use -g watchexec@latest. This may change in the future.

Arguments to mise watch will be forwarded onto watchexec. For example, to print diagnostic info:

mise watch -t build -- --print-events --verbose

See watchexec's help with watchexec --help or mise watch -- --help to see all of the options.

Licensed under the MIT License. Maintained by @jdx and friends.