Lerna is a tool which helps to manage the npm packages and versioning of monorepos projects. it has been widely used by many nodejs application such babel, reactjs, etc.

Monorepos is the concept of managing multiple projects in a single git repo. Applications such as Babel, React, Angular and ember etc were built using the monorepos method.

Example

  • Main Repo (Babel-core)
    • Package 1 (Babel-generator)
    • Package 2 (Babel-cli)

The monorepos are very useful for managing multiple small code base projects under a single umbrella.

The monorepos method has one drawback when comes to nodejs applications. The monorepos method will be extremely difficult to manage the multiple project npm packages and version control. A lot of tool available for managing these multiple npm packages and version control for monorepos project, one such tool is the Lerna

Let’s see lerna in action

Installation

npm install --global lerna

mkdir monorepo-project

cd monorepo-project

lerna init

After installation, you would able to see the following folder structure

monorepo-project/

  packages/

  lerna.json

  package.json

The lerna init has two options

  1. Fixed
    • Fixed mode Lerna projects operate on a single version line. that is single version number for all packages
  2. Independent
    • Independent mode Lerna projects allow maintainers to increment package versions independently of each other.

By default, lerna init works with fixed mode, if you need to specify independent mode, following command should be used

lerna init --independent

Installing NPM Packages

Lets us create two node package inside packages folder.

monorepo-project/

 packages/

  package_1/

  package.json

 package_2

  package.json

lerna.json

package.json

Package 1 has following npm dependencies in the package.json

  • lodash
  • async

Package 2 has following npm dependencies in the package.json

  • lodash
  • camalize

Now run the following command to install npm dependencies on all modules in the packages in a single shot

lerna bootstrap

once after the bootstrapping is done, all dependencies will be installed in respective packages.

packages

package_1

 node_modules/

  lodash/

  async

package_2

 node_modules/

  lodash/

  camalize

Interlinking Projects

Lerna provides a facility to make intra-package references in out of box manner. Let’s say, we need to use package_2 in package_1. the following command will do the job like a boss

lerna add package_2 --scope=package_1

The impact of the following would be

packages

 package_1

  node_modules/

   lodash/

   async/
 
   package_2/ (symbolic link)

Lerna Publish

Creates a new release of the packages that have been updated. Prompts for a new version. Creates a new git commit/tag in the process of publishing to npm.

References

https://github.com/lerna/lerna

https://lernajs.io/

Leave a Reply

Your email address will not be published. Required fields are marked *