Publier une librairie avec plusieurs packages à l'aide de Turborepo
Temps de lecture estimé: 5 minutes
02/10/2022
Plusieurs packages ?
Maintenant que nous savons publier un package sur npm, nous allons voir comment gérer une librairie qui comporte plusieurs packages.
Vous pouvez consulter cet exemple pour voir une application concrète.
Configuration
Pour gérer plusieurs modules ensemble nous allons utiliser Turborepo que vous avez déjà pu voir dans d'un article précédent.
Vous pouvez supprimer les différents exemples de packages de base, nous allons créer les nôtres par la suite.
Builder
On va commencer par créer un package pour gérer les builds de nos librairies. Celui-ci ne sera pas publié mais uniquement partagé dans notre monorepo.
Créez un dossier builder
dans packages
puis créez les fichiers suivants :
package.json
index.js
Nos packages
Maintenant nous pouvons créer nos différents packages. Pour l'exemple nous allons en créer deux.
Core
Toujours dans le dossier packages
on va créer un dossier core
et les fichiers suivants :
package.json
Vous remarquerez que nous avons utilisé un scope pour notre nom de package
@example
. Pour utiliser le votre vous devez créer une organisation du même nom sur npm.
src/index.ts
tsconfig.json
Age
Même chose pour notre deuxième package @example/age
package.json
On ajoute une dependance à core :
index.ts
Turbo build
Nos deux packages sont prêts, il ne reste plus qu'à les builder ensemble. Il faut tout de même paramétrer Turborepo pour builder core
avant age
.
A la racine du repo :
turbo.json
package.json
On peut déjà exécuter les commandes suivantes pour un premier build :
Test
Si vous souhaitez ajouter des tests je vous conseille Vitest. Vous pouvez suivre la docs de Turborepo à ce sujet.
Versionning
Une étape un peu complexe est de gérer les bonnes versions des dépendances. Le plus simple est de considérer que tous nos packages possèdent le même numéro de version. On va tout de même devoir utiliser un script pour incrémenter notre numéro de versions sur toutes nos dépendances avant chaque publication.
Pour ça on utilise turboversion
:
Le script sera exécuté avant chaque publication dans notre CI. Pour expliquer rapidement ce qu'il fait, il va scanner tout notre monorepo et incrémenter le numéro de version (patch, minor ou major) des dépendances et packages de notre scope example
.
Publication
On va reprendre notre Github Action de l'article précédent pour l'adapter à notre monorepo :
.github/workflows/publish.yml
Voilà, vous pouvez maintenant publier votre librairie et l'ensemble de ses packages avec un numéro de version cohérent.
Je suis Simon Boisset, développeur fullstack freelance. Je travaille principalement avec React, React Native et Node.js. Je suis disponible pour des missions de développement ou de conseil. N'hésitez pas à me contacter sur mon site.