Photo by Michael Dziedzic on Unsplash
pnpm monorepo quick start
2 min read
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:
packages: - 'packages/*'
After that, create a
packages dir in your project root.
Create a package
Create a subdirectory in
cd packages mkdir core cd core
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:
pnpm add eslint -w
-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:
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:
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:
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:
/* <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:
/* in packages/web/package.json */ "name": "@someteam/web"
That's the point, you've learned the basics of monorepo.