Run tasks/scripts across Yarn/Lerna/Bolt/etc workspaces.
npm install workspaces-run
Run a command across every workspace:
$ workspaces-run -- echo "hello world"
@project/workspace-one | hello-world
@project/workspace-two | hello-world
@project/workspace-three | hello-world
$ workspaces-run --parallel -- script.sh
@project/workspace-one | working...
@project/workspace-two | working...
@project/workspace-three | working...
@project/workspace-one | done.
@project/workspace-two | done.
@project/workspace-three | done.
# On a machine with 2 physical cores
$ workspaces-run --parallel=physical-cores -- script.sh
@project/workspace-one | working...
@project/workspace-two | working...
@project/workspace-one | done.
@project/workspace-three | working...
@project/workspace-two | done.
@project/workspace-three | done.
$ workspaces-run --parallel=2 -- script.sh
@project/workspace-one | working...
@project/workspace-two | working...
@project/workspace-one | done.
@project/workspace-three | working...
@project/workspace-two | done.
@project/workspace-three | done.
# When "one" and "two" depend on "three"
$ workspaces-run --order-by-deps -- script.sh
@project/workspace-three | working...
@project/workspace-three | done.
@project/workspace-one | working...
@project/workspace-one | done.
@project/workspace-two | working...
@project/workspace-two | done.
# When "three" is in "devDependencies" of "one" but in "peerDependencies" of "two"
$ workspaces-run --order-by-deps=devDependencies -- script.sh
@project/workspace-two | working...
@project/workspace-two | done.
@project/workspace-three | working...
@project/workspace-three | done.
@project/workspace-one | working...
@project/workspace-one | done.
$ workspaces-run --continue-on-error -- script.sh
@project/workspace-one | working...
@project/workspace-one | Error!
@project/workspace-two | working...
@project/workspace-two | Error!
@project/workspace-three | working...
@project/workspace-three | done.
$ workspaces-run --no-prefix -- script.sh
working...
done.
working...
done.
working...
done.
The task will be run on a workspace if all of the conditions are true.
- When any of the
--only
patterns match the workspacepackage.json#name
; and - When any of the
--only-fs
patterns match the workspace directory; and - When all of the
--ignore
patterns do not match the workspacepackage.json#name
; and - When all of the
--ignore-fs
patterns do not match the workspace directory.
Patterns support any syntax available in micromatch:
workspaces-run --only-fs="**/path/to/dir/**"
workspaces-run --only="workspace-{one,two}"
Flags can be specified multiple times:
workspaces-run --only=<pattern> --only=<patern>
The flags --only-fs
and --ignore-fs
match against a relative path to the
current working directory.
import workspacesRun from "workspaces-run"
await workspacesRun({ cwd }, async (workspace, allWorkspaces) => {
await doSomething(workspace)
})
let cwd = process.cwd()
await workspacesRun({ cwd }, ...)
await workspacesRun({ cwd, parallel: true }, ...)
await workspacesRun({ cwd, parallel: "physical-cores" }, ...)
await workspacesRun({ cwd, parallel: 3 }, ...)
await workspacesRun({ cwd, orderByDeps: true }, ...)
await workspacesRun({ cwd, orderByDeps: ["devDependencies"] }, ...)
await workspacesRun({ cwd, continueOnError: true }, ...)
The task will be run on a workspace if all of the conditions are true.
- When any of the
only
patterns match the workspacepackage.json#name
; and - When any of the
onlyFs
patterns match the workspace directory; and - When all of the
ignore
patterns do not match the workspacepackage.json#name
; and - When all of the
ignoreFs
patterns do not match the workspace directory.
Patterns support any syntax available in micromatch:
await workspacesRun({
cwd,
only: ["workspace-{one,two}"],
onlyFs: ["**/path/to/dir/**"],
}, ...)
The options onlyFs
and ignoreFs
match against a relative path to the cwd
.