jamiebuilds / workspaces-run

Run tasks/scripts across Yarn/Lerna/Bolt/etc workspaces.
MIT License
94 stars 2 forks source link

workspaces-run

Run tasks/scripts across Yarn/Lerna/Bolt/etc workspaces.

Install

npm install workspaces-run

CLI

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

--parallel

$ 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.

--parallel=physical-cores

# 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.

--parallel=<number>

$ 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.

--order-by-deps

# 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.

--order-by-deps=<dependencyType>

# 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.

--continue-on-error

$ 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.

--no-prefix

$ workspaces-run --no-prefix -- script.sh
working...
done.
working...
done.
working...
done.

CLI Filtering

The task will be run on a workspace if all of the conditions are true.

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.

Library

import workspacesRun from "workspaces-run"

await workspacesRun({ cwd }, async (workspace, allWorkspaces) => {
  await doSomething(workspace)
})

opts.cwd (Required)

let cwd = process.cwd()

await workspacesRun({ cwd }, ...)

opts.parallel

await workspacesRun({ cwd, parallel: true }, ...)
await workspacesRun({ cwd, parallel: "physical-cores" }, ...)
await workspacesRun({ cwd, parallel: 3 }, ...)

opts.orderByDeps

await workspacesRun({ cwd, orderByDeps: true }, ...)
await workspacesRun({ cwd, orderByDeps: ["devDependencies"] }, ...)

opts.continueOnError

await workspacesRun({ cwd, continueOnError: true }, ...)

Library Filtering

The task will be run on a workspace if all of the conditions are true.

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.