MonoRepo Manager - Lerna

About

Lerna is a wrapper around package manager that optimizes the workflow around managing multi-package repositories with git and yarn

Issues

Architecture

Run

You can no longer work on a single package by cd-ing into it, and using normal npm/yarn scripts.

This is because of the way lerna hoists commands up to the root level. When working on a single package, instead run the lerna command with a scope of that package name.

Example:

  • Global for all packages
lerna run build
  • Only for one package
lerna run build --scope 'packageName'
lerna run test --scope 'packageName'

Command Mapping

Npm/Yarn command Lerna Command Desc
install bootstrap Install all packages dependencies and link any cross-dependencies

Dependency

hoisting is just a way to install all dependencies up to the root directory of lerna (the topmost directory) (no node_modules directory at every project). The tools must follows the Node module resolution algorithm to find them. Lerna does not create symlink. See also: hosting in yarn

and –parallel for installing dependencies

Dev Dependency

  • devDependencies can be pulled up to the root package.json of a Lerna repo

Cross Packages Dependency

See lerna link - Symlink together all Lerna packages that are dependencies of each other in the current Lerna repo.

hosted on GitHub: https://github.com/lerna/lerna#git-hosted-dependencies

Package hosted in git

{
  "name": "pkg-2",
  "version": "1.0.0"
}
{
  "name": "pkg-1",
  "version": "1.0.0",
  "dependencies": {
    "pkg-2": "github:example-user/pkg-2#v1.0.0"
  }
}

Command

Bootstrap

Instead of running npm install in order to install dependencies, you should run lerna bootstrap.

See FAQ

Bootstrap:

  • Installing all packages dependencies
  • Linking any cross-dependencies
yarn global add lerna
lerna bootstrap
lerna notice cli v3.13.4
lerna info Bootstrapping 1 package
lerna info Installing external dependencies
lerna info Symlinking packages and binaries
lerna success Bootstrapped 1 package

Add

  • A dev dependency to all package
lerna add eslint --dev
# then
lerna bootstrap
  • A dependency to one package
lerna add eslint packages\myPackage
# then
lerna bootstrap

Example of output:

lerna notice cli v3.13.4
lerna info versioning independent
lerna info Adding eslint in 3 packages
lerna notice filter excluding "component-*"
lerna info filter [ '!component-*' ]
lerna info Bootstrapping 3 packages
lerna info Installing external dependencies
lerna info Symlinking packages and binaries
lerna success Bootstrapped 3 packages

Run

- Test will run first Pretest

cd MonoRepoRoot
lerna run test
lerna notice cli v3.13.4
lerna info versioning independent
lerna info Executing command in 1 package: "yarn run test"
lerna info run Ran npm script 'test' in 'micro-now' in 15.0s:
yarn run v1.15.2
$ eslint src
$ jest
  console.log src/router.js:3
    /api/profiles/(?<id>[^/]*)

  console.log src/router.js:4
    backend/api/profiles/profile.js?id=$id

Done in 14.12s.
lerna success run Ran npm script 'test' in 1 package in 15.0s:
lerna success - micro-now

Publish

#scope is for package names ?
lerna publish --scope="pkg-*"

Symlink together all Lerna packages that are dependencies of each other in the current Lerna repo.

lerna link

bootstrap link also

Note

Sync to standalone repo

[splitsh](https://github.com/splitsh/lite) automatically synchronize a monolithic repository to standalone repositories in real-time

Verdaccio

yarn global add verdaccio

Powered by ComboStrap