About
Lerna is a wrapper around package manager that optimizes the workflow around publishing multi-package repositories with git and yarn
Articles Related
Issues
- It's not a full mono repository manager as it would handle only package that you publish (not app that use this packages).
- As lerna is a wrapper around a package manager, it has limitations. See Workspaces in Yarn - Lerna
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-*"
Link
The link command base concept of all monorepo that symlink together all Lerna packages that are dependencies of each other in the current Lerna repo.
lerna link
bootstrap link also
Note
Verdaccio
yarn global add verdaccio