# pnpm monorepo quick start

## Introduction

When you open this article, I acquiesce that you know about monorepo, so I don't want to talk nonsense, let's start straight away.

## Create a workspace

First, you need to initialize your project and run `pnpm init` in your project root. Then create a `pnpm-workspace.yaml`, and fill in the following configuration:

```yml
packages:
  - 'packages/*'
```

After that, create a `packages` dir in your project root.

## Create a package

Create a subdirectory in `<root>/packages`, like `web` or `core`.

```shell
cd packages
mkdir core
cd core
```

Run `pnpm init` in core dir, and you will get your first package. Take a look at `<root>/packages/core/package.json`, the name field is your package name.

## Run the command in the specified package

Some packages are used in the whole project, like eslint, so we can install them in the workspace:

```shell
pnpm add eslint -w
```

Add the `-w` flag to the original add command to make the command run in the workspace. Some dependencies are only used in the frontend, like react, we can install only in frontend packages:

```shell
pnpm add -r --filter web react
```

Add the flag `-r` means you want to run the command in packages. But in this way, the dependencies will install in all packages, so you need the `--filter` flag to the specified package. Similarly, not only the install command, other commands like `pnpm run` are the same, `pnpm run -w lint` will run the workspace's lint script, `pnpm run -r dev` will run all packages' dev scripts.

## Install another package in the workspace

When you run `pnpm add`, pnpm will take a look at the current workspace if there are some dependencies in your workspace:

```shell
pnpm add core -r --filter web
```

This will install the core package for the web package, open the web package's `package.json`, and you will find this:

```js
"core": "workspace:^1.0.0"
```

Notice the `workspace` here, it means the core package is installed from the workspace, not npm registry. Then we can import the core's file in web packages:

```ts
/* <root>/packages/web/index.ts */
import some from 'core'
```

As you may have noticed, if packages in the workspace have the same name as another package in npm, it will be confusing and dangerous (maybe), so you'd better add package scope:

```js
/* in packages/web/package.json */
"name": "@someteam/web"
```

## Conclusion

That's the point, you've learned the basics of monorepo.
