Tout sur le monorepo
(monorepo.tools)Qu’est-ce qu’un monorepo ?
- « Mettre plusieurs projets distincts dans un seul repo, avec des relations clairement définies entre eux »
- Monorepo ≠ Monolithe
Pourquoi le faire ?
- Si l’on choisissait jusqu’ici le modèle Polyrepo (utiliser plusieurs repo), c’était pour l’« autonomie des équipes (team autonomy) »
- Les équipes pouvaient choisir les bibliothèques qu’elles voulaient, et décider qui contribue au code et qui l’utilise
- Polyrepo
- le partage de code est fastidieux
- il y a beaucoup de duplication de code
- en cas de bug critique ou de changement majeur dans une bibliothèque partagée, le coût est élevé
- les outils de développement utilisés varient selon les projets
- Monorepo
- aucun surcoût pour créer un nouveau projet
- commits atomiques à l’échelle de l’ensemble des projets
- tout est géré avec un seul numéro de version
- mobilité des développeurs (passage d’un projet à l’autre)
Fonctions proposées par les outils de monorepo et comparaison entre eux
→ Bazel, Gradle, Lage, Lerna, Nx, Rush, Turborepo
- cache local
- orchestration locale des tâches
- cache distribué
- exécution distribuée des tâches
- exécution distante transparente
- détection des projets/packages impactés
- analyse du workspace
- visualisation du graphe des dépendances
- partage de code
- outillage cohérent
- génération de code
- contraintes de projet et visibilité
Changement de perspective
Le monorepo change votre « organisation et votre façon de penser le code »
- en ajoutant de la cohérence,
- en réduisant les frictions lors de la création de nouveaux projets ou de grands refactorings,
- en favorisant le partage de code et la collaboration entre équipes,
- l’organisation peut travailler plus efficacement
Il existe diverses solutions, mais chacune a des objectifs différents
- Bazel (par Google) : « A fast, scalable, multi-language and extensible build system. »
- Gradle (par Gradle, Inc) : « A fast, flexible polyglot build system designed for multi-project builds. »
- Lage (par Microsoft) : « Task runner in JS monorepos »
- Lerna : « A tool for managing JavaScript projects with multiple packages. »
- Nx (par Nrwl) : « Next generation build system with first class monorepo support and powerful integrations. »
- Rush (par Microsoft) : « Geared for large monorepos with lots of teams and projects. Part of the Rush Stack family of projects. »
- Turborepo (par Vercel) : « The high-performance build system for JavaScript & TypeScript codebases. »
4 commentaires
Lorsqu’on développe une application et qu’on l’installe chez chaque client,
certains clients finissent par ne plus vouloir de mises à niveau,
et d’autres demandent leur propre version spéciale.
Alors, à mesure que ce type de clients se multiplie,
on se retrouve finalement avec un repository rempli de dizaines de branches personnalisées pour chaque client.
Chaque branche contient une version légèrement différente.
Dans ce contexte, quand je lis des articles sur le monorepo… ça ressemble vraiment à un rêve, haha.
Ça me rappelle que Torvalds avait dit que, dans la plupart des cas, les bibliothèques partagées ne sont pas une bonne idée... Je suis en train d’en appliquer récemment, et au final il y a moins d’éléments réellement mutualisables que je ne le pensais, alors que les problèmes d’enchevêtrement du système de build sont importants ; du coup, j’ai l’impression que le monorepo n’est pas un système aussi idéal qu’on l’attendait.
À l’époque où Subversion dominait, c’était simplement quelque chose de tout à fait naturel, donc je trouve qu’il y a là une vraie forme d’ironie.
Je trouve aussi étrange que le sujet soit traité uniquement sous l’angle du développement frontend.
Chez Microsoft, ils ont créé un système de fichiers virtuel pour pouvoir utiliser Git un peu comme Subversion, et je trouve dommage que cela ne se soit pas généralisé.
J’ai l’impression qu’en ce moment, on ressent encore plus que les technologies reviennent toujours en boucle.
Parfois, je me dis : « Hé, ce n’est pas ce truc qu’on trouvait déjà pas terrible avant ? »… Je me demande si je traîne dans le milieu depuis trop longtemps. Snif.