Monorepos & Workspaces
Workspaces are handled out-of-the-box by Knip.
Workspaces are sometimes also referred to as package-based monorepos, or as
packages in a monorepo. Knip uses the term workspace exclusively to indicate a
directory that has a package.json.
Configuration
Section titled “Configuration”Here’s example configuration with custom entry and project patterns:
{ "workspaces": { ".": { "entry": "scripts/*.js", "project": "scripts/**/*.js" }, "packages/*": { "entry": "{index,cli}.ts", "project": "**/*.ts" }, "packages/cli": { "entry": "bin/cli.js" } }}Each workspace has the same default configuration.
The root workspace is named "." under workspaces (like in the example
above).
Workspaces
Section titled “Workspaces”Knip reads workspaces from four possible locations:
- The
workspacesarray inpackage.json(npm, Bun, Yarn, Lerna) - The
packagesarray inpnpm-workspace.yaml(pnpm) - The
workspaces.packagesarray inpackage.json(legacy) - The
workspacesobject in Knip configuration
The workspaces in Knip configuration (4) not already defined in the root
package.json or pnpm-workspace.yaml (1, 2, 3) are added to the analysis.
For projects with only a root package.json, please see integrated
monorepos.
Additional workspaces
Section titled “Additional workspaces”If a workspaces is not configured as such in package.json#workspaces (or
pnpm-workspace.yaml) it can be added to the Knip configuration manually. Add
their path to the workspaces configuration object the same way as
"packages/cli": {} in the example above.
Source mapping
Section titled “Source mapping”See Source Mapping.
Additional options
Section titled “Additional options”The following options are available inside workspace configurations:
Plugins can be configured separately per workspace.
Use --debug for verbose output and see the workspaces Knip includes, their
configurations, enabled plugins, glob options and resolved files.
Lint a single workspace
Section titled “Lint a single workspace”Use the --workspace (or -W) argument to focus on a single workspace (and let
Knip run faster). Example:
knip --workspace packages/my-libThis will include the target workspace, but also ancestor and dependent workspaces. For two reasons:
- Ancestor workspaces may list dependencies in
package.jsonthe linted workspace uses. - Dependent workspaces may reference exports from the linted workspace.
To lint the workspace in isolation, there are two options:
- Combine the
workspaceargument with strict production mode. - Run Knip from inside the workspace directory.
ISC License © 2024 Lars Kappert