Workspace Scripts
Workspace scripts can be executed with melos run
or will be executed as
lifecycle hooks of some specific Melos commands.
With the simple syntax, only the name of the script and the command to execute needs to be specified:
scripts:
hello: echo 'Hello World'
The extends syntax allows for a more complex configuration of a script:
scripts:
hello:
name: hey
description: Greet the world
run: echo '$GREETING World'
env:
GREETING: 'Hey'
Scripts are executed in a shell. On Windows the shell is cmd.exe
and on all
other platforms it is sh
.
If multiple commands are being executed in a script and no further commands
should be executed after a command has failed, connect the commands with &&
:
scripts:
prepare: melos bootstrap && melos run build
steps
Enables the combination of multiple scripts within a single script definition for complex workflows. In the example below, the pre-commit script is configured to sequentially invoke a simple command echo 'hello world', followed by Melos commands: format and analyze, each with specific arguments.
scripts:
pre-commit:
description: pre-commit git hook script
steps:
- echo 'hello world'
- format --output none --set-exit-if-changed
- analyze --fatal-infos
Note: When utilizing the steps
, it's important to understand that options
related to exec — such as concurrency — or packageFilters
cannot be directly
applied within the steps configuration. Instead, these options should be
configured in the individual scripts that are being called as part of the step.
exec
Execute a script in multiple packages through melos exec
.
This options must either contain the command to execute in multiple packages or
the options for the melos exec
command.
When using the default options for melos exec
, it's easiest to specify the
command in the exec
option:
scripts:
hello:
exec: echo 'Hello $(dirname $PWD)'
If you need to provide options for the exec
command, specify them in the
exec
option and specify the command in the run
option:
scripts:
hello:
run: echo 'Hello $(dirname $PWD)'
exec:
concurrency: 1
See the packageFilters
option for
filtering the packages to execute the command in.
concurrency
Defines the max concurrency value of how many packages will execute the command
in at any one time. Defaults to 5
.
failFast
Whether exec
should fail fast and not execute the script in further packages
if the script fails in an individual package. Defaults to false
.
orderDependents
Whether exec
should order the execution of the script in multiple packages
based on the dependency graph of the packages. The script will be executed in
leaf packages first and then in packages that depend on them and so on. This is
useful for example, for a script that generates code in multiple packages, which
depend on each other. Defaults to false
.
packageFilters
The melos exec
command allows you to execute a command for
multiple packages. When used in a script, you can declare filter options in the
packageFilters
section.
The hello_flutter
script below is only executed in Flutter packages:
scripts:
hello_flutter:
exec: echo 'Hello $(dirname $PWD)'
packageFilters:
flutter: true
See the global options for a list of supported filters.
The filter names in packageFilters
are camel cased. For example, for the
equivalent of the command line option --file-exists
use fileExists
.
When running a script that uses packageFilters
, you will be prompted to select
the package to execute the script in. If you want to skip this prompt and run
the script in all packages, use the --no-select
option.
Hooks
Certain Melos commands support running scripts before and after the command is executed, as well as at other interesting points in the command's execution.
All commands that support hooks, support at least the pre
and post
hook.
Hooks are configured in the hooks
section of a command's configuration in the
melos.yaml
file.
command:
bootstrap:
hooks:
pre: echo `bootstrap command is running...`
post: echo `bootstrap command is done`
Currently, the following Melos commands support hooks: