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
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:
- test
- lint
- doc
- install-all
- audit-all
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.
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
- Cet outil est très pratique pour faire du CI/CD.
- Fonctionne bien sur toutes les distributions (Windows, macOS & Linux).
- Une commande pour gérer tous les packages.
- J’ai réussi à le tweaker pour l’utiliser avec des modules Python (peut-être pas la façon la plus beautiful, mais ça fonctionne bien).
- Fonctionne bien pour les monorepos, ou même un repository contenant le frontend et le backend.
Voir les articles suivants pour plus d’information:
- Prettier (Formatter le code en utilisant un fichier de configuration)
- Jest (tester le code source)
- Lint-staged (Lancer eslint lors du commit)
- Commit-lint (standardiser les messages des commit)
- Husky (Gestion des git hooks simplifiés)