Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFC: npm workspaces - Config management #273

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions accepted/0000-workspaces-config-management.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# npm workspaces: Config management

## Summary

Series of subcommands to allow managing what paths/folders should be handled as **workspaces**.

## Motivation

Minimize manual editing of the `package.json` file while providing more resilient and automated workflows for defining **workspaces** within your project.

## Detailed Explanation

- Add positional `workspaces` argument e.g: `lib/workspaces.js` that provides subcommands to enable workflows for **workspaces*** config management.

## Rationale and Alternatives

- The obvious alternative is to choose to not provide subcommands to handle **workspaces** config management.
- Others? TBD

## Implementation

```
# Given a structure:
.
├── package.json { "name": "foo" }
└── packages
├── dep-a
│ └── package.json { "name": "dep-a", "version": "1.0.0" }
└── dep-b
└── package.json { "name": "dep-b", "version": "1.3.1" }

$ npm workspaces ls

$ npm workspaces add ./packages/dep-a
Copy link

@jamiebuilds jamiebuilds Apr 6, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reading npm workspaces add <package> I would not expect it to mutate the root config. I would expect it to mirror npm workspaces install <package> in #117 since npm add/rm are already aliases to install/uninstall dependencies.

I think npm workspaces <subcommand> can either be a command that operates on package.json#workspaces or every <workspaces>/package.json mixing and matching is confusing.

One thing we did in Bolt was have a bolt project/p command that allowed you to run commands on the root package containing all the workspaces.

Alternatives:

  • npm workspaces-config add/rm
  • npm project workspaces add/rm
  • npm workspaces add-workspace/rm-workspace


$ cat package.json
{
"name": "foo",
"workspaces": [
"./packages/dep-a"
]
}

$ npm workspaces ls
dep-a@1.0.0 -> ./packages/dep-a

$ npm workspaces add ./dep-b

$ cat package.json
{
"name": "foo",
"workspaces": [
"./packages/dep-a",
"./packages/dep-b"
]
}

$ npm workspaces ls
dep-a@1.0.0 -> ./packages/dep-a
dep-b@1.3.1 -> ./packages/dep-b

# Remove by name/spec:
$ npm workspaces rm dep-a

# Remove by path:
$ npm workspaces rm ./packages/dep-b

$ cat package.json
{
"name": "foo",
"workspaces": []
}

$ npm workspaces ls

# Add glob:
$ npm workspaces add ./packages/*

$ cat package.json
{
"name": "foo",
"workspaces": [
"./packages/*"
]
}

$ npm workspaces ls
dep-a@1.0.0 -> ./packages/dep-a
dep-b@1.3.1 -> ./packages/dep-b
```

## Prior Art

TBD

## Unresolved Questions and Bikeshedding

TBD