DEV Community

Victor Magarlamov
Victor Magarlamov

Posted on

Monorepo App with Lerna

Monorepo is a way to organize an application. In this case, the application is divided into several parts, each of which is a separate package. For example, look at the React repository. You will see that the main parts of this library are separate packages: "react-reconciler", "react-dom"… In other word, monorepo is a multi-package repository.

What are the advantages of this way? In a nutshell, separation into logical parts facilitates versioned, testing and understanding of the overall project. But better than any words is practical experience.

Many years ago I made a personal website for the russian artist Gregory Maiofis. It was a monolithic Ruby On Rails application. Recently I decided to rewrite this as a single-page and monorepo application. You can see the result on github.

In this work I used Lerna and below I want to tell you (in short) how to use this multi-package application management tool.

The first command is lerna init. It creates a new lerna repo. Open the lerna.json file after executing this and add the following lines:

"useWorkspaces": true, 
"command": {
  "run": {
    "npmClient": "yarn"
  }
}

And add to the package.json file:

"workspaces": {
  "packages": [
    "packages/*"
  ]
}

These changes allow us to use yarn workspaces.

I organized my project in the following manner:

packages
  |---app   // main application with CRA
  |---admin // Admin Panel
  |---ui    // a library of common React components
  |---api   // a library for working with API

The main commands:

// bootstrap the packages in the current Lerna repo
lerna bootstrap

// Symlink together all packages
lerna link

// execute the "start" command in all packages 
// that contains this command
// in my case it will be "app" and "admin"
lerna run start

// execute the build command in the "ui" package only
lerna run --scope @project/ui build

Discussion (4)

Collapse
patarapolw profile image
Pacharapol Withayasakpunt

OK, just don't Lerna to mix frontend and backend. They needs different kinds of node_modules.

Collapse
victormagarlamov profile image
Victor Magarlamov Author • Edited

Yes, I understand it. In my project the api package is a set of methods that send requests to backend. But anyway thanks for your comment)

Backend and frontend in one is a monolithic app.

Collapse
zkochan profile image
Zoltan Kochan

I'd recommend to use pnpm + changesets or Rush instead of Lerna.

Collapse
victormagarlamov profile image
Victor Magarlamov Author

Thank you for these links! I didn't know about these projects.