<
Media
>
Article

Monorepo : La stratégie transformant votre développement logiciel

7 min
15
/
05
/
2024

Introduction

Alors que la tendance dominante consiste à diviser nos _codebases_, microservices et microfront-ends en plusieurs _repo_ distincts, les Monorepos permettent de regrouper différents projets au sein d'un référentiel unique. Voyons les avantages de cette approche.

Dans cet article, nous définirons ce qu'est un Monorepo et expliquerons en quoi il diffère de l'approche Polyrepo, puis nous explorerons les avantages et les contraintes liés à l'architecture Monorepo.

Nous parlerons aussi de Nx, l’outil de gestion open source conçu spécifiquement pour les Monorepos, qui offre de nombreux avantages.

J'ai choisi ce sujet car, malgré une incompréhension courante et une réticence à l'adopter, le Monorepo représente une alternative intéressante à l'approche traditionnelle Polyrepo lorsque les projets sont interconnectés. De plus, avec des outils comme Nx, les Monorepos deviennent de plus en plus accessibles aux développeurs.

1. Qu’est-ce qu’un Monorepo ?

Un Monorepo est une architecture logicielle dans laquelle plusieurs projets peuvent coexister au sein d'un même référentiel. Contrairement à l'architecture Polyrepo, qui héberge plusieurs projets dans des référentiels distincts, le Monorepo regroupe plusieurs projets qui ont une relation entre eux dans un seul et même référentiel.

1.1 Dans une architecture Polyrepo

cf. visuel en fin d'article

Voici deux repo : celui de gauche héberge une librairie de composants réutilisables et celui de droite héberge une application front-end qui utilise et importe la librairie en tant que module.

Dans ce cas précis, si je dois créer ou modifier un composant dans la librairie pour qu’il soit utilisé par mon front-end, je dois produire le code, effectuer un commit, créer une version, puis importer les changements et adapter mon code dans le projet front-end, effectuer un nouveau commit, puis un build avant de l'envoyer en production.

1.2 Dans une architecture Monorepo

cf. visuel en fin d'article

À présent, voici deux projets distincts cohabitant dans un seul repo. La librairie est toujours utilisée dans le projet d'application front-end. Il ne s'agit pas d'un module mais bien d'un dossier situé à côté de notre projet front-end.

Avec cette architecture, pour créer ou modifier un composant dans la librairie utilisée par le front-end, je dois produire le code, appliquer les changements directement dans mon projet front-end, effectuer un unique commit, puis build et mettre en production.

Cette architecture nécessite moins d'étapes que l'architecture Polyrepo, tout en obtenant le même résultat. Les deux projets évoluent dans le même référentiel.

2. Quand et comment utiliser l’architecture Monorepo ?

2.1 Lorsque les désavantages de l'utilisation de plusieurs repos se font sentir


Par exemple, la nécessité de synchroniser constamment plusieurs repo.
Imaginons que j'ai une application front-end et une application back-end dans deux repo `git` distincts.
Certaines branches du repo front-end peuvent dépendre de branches du repo back-end ; les dépendances entre référentiels peuvent rapidement devenir laborieuses à gérer.

2.2 Lorsqu'il n'y a qu'une seule version pour tous vos projets


L'utilisation de l'architecture Monorepo est recommandée lorsque les projets partagent des ressources, des configurations et du code en commun.
En Monorepo, à partir de quelques fichiers de code et de configuration, vous pouvez partager, importer et diffuser dans d'autres projets des informations aussi variées que des typages, des classes étendues, une charte graphique commune, des configurations TypeScript et linter, etc.

3. Quelles sont avantages et les contraintes des Monorepos ?

3.1 Les avantages

- **Réutilisation du code :** pas besoin de réinventer la roue, le code commun réutilisable peut être diffusé dans tous les projets avec des imports.
- **Versioning simplifié :** utilisation d'une seule branche pour chaque fonctionnalité, sans ajouter de complexité avec des branches supplémentaires et sans utiliser de multiples référentiels.
- **Standardisation du code :** mise en place des mêmes normes sur l'ensemble des applications.
- **Meilleure expérience développeur :** avoir le code complet de l'application dans l'éditeur facilite le développement et améliore la fiabilité des tests.

3.2 Les inconvénients

- **Nouvelle organisation de travail :** il est nécessaire d'adopter une nouvelle organisation de travail pour coordonner les équipes, gérer les nouvelles fonctionnalités, les tests et le déploiement de chaque application.
- **Complexité :** il peut être moins évident de s'orienter que dans un repo classique, car le Monorepo apporte plus de complexité. L'arrivée d'un nouveau développeur nécessite une formation supplémentaire afin qu'il puisse prendre en main les outils mis en place.
- **Configuration :** la configuration des projets _via_ un Monorepo peut prendre du temps, notamment les aspects d'intégration et livraison continues (CI/CD).
- **Sécurité :** toute personne ayant accès au code a également accès à l'intégralité de la base de code.

4. Nx, l'outil à tout faire pour les Monorepos

Nx est un outil open source de gestion de build qui améliore la productivité des développeurs, optimise les performances d'intégration continue (CI) et maintient la qualité du code.

Conçu pour  les Monorepos, Nx offre de nombreux avantages : meilleure organisation, collaboration plus facile et maintenance simplifiée. Il propose plusieurs outils pour gérer les Monorepos :

1. **Les workspaces et les libs**

   Les workspaces abritent les applications, c'est-à-dire vos projets. Les libs peuvent être considérées comme des modules et peuvent être importées dans les apps des workspaces, ainsi que dans d'autres libs.

   Nx gère automatiquement les liens symboliques entre les différents projets.

2. **Un système de build intelligent**

   Nx est capable de déterminer quelles tâches doivent être exécutées en fonction des changements dans le code. Gain de temps assuré !

3. **Orchestration des tâches**

   Nx permet d'exécuter des tâches dans le bon ordre et en parallèle à partir d’une seule commande et avec peu de configuration.

4. **Génération de code**

   Les générateurs sont des outils qui peuvent être utilisés pour générer du code, des configurations ou des ressources. Nx propose des générateurs prédéfinis, il existe également des générateurs créés par la communauté. Et vous avez la possibilité de créer vos propres générateurs dans vos projets.

Nx propose encore une multitude de fonctionnalités, je vous laisse les découvrir [sur son site officiel](https://nx.dev/).

Conclusion

L'architecture Monorepo est un outil puissant permettant d'améliorer la productivité et de simplifier la gestion des projets de développement. Son utilisation offre de nombreux avantages, tels qu'un référentiel unique pour chaque projet lié, une réduction de la fragmentation et de la duplication de code, une facilité pour partager du code commun, une gestion plus facile des dépendances entre les projets et une collaboration améliorée entre les équipes travaillant sur différents projets.

De plus, avec Nx, vous pouvez tirer pleinement parti des avantages de l'architecture Monorepo grâce à ses fonctionnalités avancées de gestion de build, d'orchestration des tâches et de génération de code.

---

Sources

<https://monorepo.tools/>

<https://nx.dev/>

No items found.
ça t’a plu ?
Partage ce contenu
Benjamin

Passionné par les étoiles, la programmation et les jeux-vidéos, Benjamin est un spécialiste en JavaScript, avec une spécialisation en ReactJS. Il est constamment à la recherche de nouvelles technologies pour élargir ses compétences, considérant chaque innovation comme une opportunité pour explorer de nouvelles perspectives.