Webux Lab

Par Studio Webux

Lerna

TG
Tommy Gingras Studio Webux S.E.N.C 2021-05-07

Introduction

Lerna est un outil pour gérer les projets JavaScript de type “monorepo”. Les commandes disponibles permettent de facilement et de façon optimale, de gérer les projets utilisant un seul repository git contenant plusieurs projets, modules et/ou frontend/backend.

Comment l’utiliser

Les commandes sont lancées avec Git Bash

Dans votre module NodeJS, lancer ce qui suit,

Il est très important de lancer la commande en utilisant le --save-dev pour seulement installer les packages suivant en mode développement. C’est important pour des raisons d’optimisation et de sécurité.

npm install --save-dev lerna

Vous pouvez aussi installer lerna en mode global pour pouvoir utiliser les commandes directement,

npm install -g lerna

Documentation officielle

Cet article couvrira quelques commandes de lerna.

Configuration

Lancer la commande suivante pour créer le fichier de configuration initial,

À la racine de votre projet,

npx lerna init

Le fichier lerna.json va être créé avec le contenu suivant :

{
  "packages": [
    "packages/*"
  ],
  "version": "0.0.0"
}

Structure proposée

packages/
    module1/
        .eslintrc.json
        .prettierrc
        jest.config.js
        .gitignore
        package.json
    module2/
        .eslintrc.json
        .prettierrc
        jest.config.js
        .gitignore
        package.json
    module3/
        .eslintrc.json
        .prettierrc
        jest.config.js
        .gitignore
        package.json
    .eslintrc.json
.github/
  workflows/
.husky/
  commit-msg
  pre-commit
  pre-push
.gitignore
commitlint.config.js
lerna.json
license.txt
package.json
README.md

Le contenu de votre package.json se trouvant à la racine,

{
  "name": "@webuxlab/root",
  "private": true,
  "devDependencies": {
    "@commitlint/cli": "^12.1.1",
    "@commitlint/config-conventional": "^12.1.1",
    "husky": "^6.0.0",
    "lerna": "^3.22.1",
    "lint-staged": "^10.5.4"
  },
  "scripts": {
    "test": "lerna run test",
    "lint": "lerna run lint",
    "doc": "lerna run doc",
    "install-all": "lerna run installdeps",
    "audit-fix": "lerna run auditfix",
    "prepare": "husky install",
    "pre-commit": "lint-staged",
    "pre-push": "lerna run --parallel --since origin/develop test"
  },
  "lint-staged": {
    "packages/**/*.js": "eslint"
  }
}

Vous pouvez voir les commandes:

Ces commandes utilisent lerna run <command>

Donc si nous prenons par exemple le module module1/package.json, vous devez ajouter le/les scripts suivants:

{
  "name": "@studiowebux/module1",
  "version": "0.0.0",
  "scripts": {
    "test": "jest",
    "lint": "eslint src/**",
    "doc": "jsdoc src -d jsdoc/",
    "installdeps": "npm install",
    "auditfix": "npm audit fix"
  },
  "author": "Studio Webux S.E.N.C",
  "license": "SEE LICENSE IN license.txt",
  "dependencies": {
  },
  "devDependencies": {
    "@babel/core": "^7.11.4",
    "@babel/preset-env": "^7.11.0",
    "babel-jest": "^26.3.0",
    "cors": "^2.8.5",
    "eslint": "^7.23.0",
    "eslint-config-airbnb-base": "^14.2.0",
    "eslint-config-prettier": "^8.1.0",
    "eslint-plugin-import": "^2.22.0",
    "eslint-plugin-jest": "^24.3.6",
    "eslint-plugin-prettier": "^3.3.1",
    "express": "^4.17.1",
    "jest": "^26.4.2",
    "jsdoc": "^3.6.5",
    "prettier": "^2.2.1",
    "socket.io": "^4.0.1",
    "supertest": "^6.1.3"
  }
}

Comme vous pouvez voir lerna n’est pas définie dans ce package.json.

De plus, lerna va automatiquement analyser le/les répertoire(s) définis dans le fichier lerna.json.

Puis si la commande existe dans le package.json trouvé, lerna va lancer la commande.

En résumé, directement à partir de la racine de votre repository, vous pouvez lancer une commande qui automatiquement va être exécutée dans tous les modules que vous avez.

Commandes

Voici celles que j’utilise le plus souvent,

Je vous invite à consulter la documentation officielle pour avoir tous les détails et bien sûr toutes les commandes disponibles.

Documentation officielle

Publish
lerna publish

Cette commande permet de déployer vos modules nodejs sur un répertoire externe (NPMJS, Github packages et autres), vous allez obtenir un Shell interactif.
Les modules (packages) déployés vont automatiquement utiliser la version spécifiée dans le fichier lerna.json puis publier seulement les modules qui ont changé.
Donc encore une fois, vous pouvez utiliser une commande pour créer une version, publier le package, sans devoir manuellement vérifier chaque module.

Une autre commande similaire est version, vous pouvez aussi créer une version sans la publier avec lerna version

Voici un exemple:

$ lerna publish

lerna notice cli v4.0.0
lerna info current version 5.0.1
lerna info Looking for changed packages since v5.0.1
? Select a new version (currently 5.0.1) Minor (5.1.0)

Changes:
 - @studiowebux/fileupload: 5.0.1 => 5.1.0

? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
lerna info Verifying npm **credentials**
...
list
lerna list

Liste les package.json trouvés dans votre projet.

Exemple:

lerna notice cli v4.0.0
@studiowebux/app
@studiowebux/fileupload
@studiowebux/generator
@studiowebux/logger
@studiowebux/mailer
@studiowebux/route
@studiowebux/security
@studiowebux/server
@studiowebux/socket
@studiowebux/sql
lerna success found 10 packages

Conclusion

Voir les articles suivants pour plus d’information:


Recherche