You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.0 KiB
Markdown
157 lines
4.0 KiB
Markdown
# ADR-001 : Structure Mono-repo avec pnpm Workspaces
|
|
|
|
**Statut** : ✅ Accepté
|
|
**Date** : Octobre 2025
|
|
**Décideurs** : Équipe Architecture
|
|
**Tags** : `organisation`, `tooling`
|
|
|
|
---
|
|
|
|
## Contexte
|
|
|
|
Le projet BricoLoc Architecture Evolution comprend **deux applications distinctes** (Legacy et Moderne) ainsi que de la **documentation partagée**. Nous devons décider de l'organisation du code source.
|
|
|
|
### Options considérées
|
|
1. **Multi-repo** : 3 repositories séparés (legacy, modern, docs)
|
|
2. **Mono-repo** : 1 seul repository avec workspaces
|
|
3. **Mono-repo hybride** : 1 repo principal + submodules Git
|
|
|
|
---
|
|
|
|
## Décision
|
|
|
|
✅ **Nous adoptons un mono-repo avec pnpm workspaces**
|
|
|
|
---
|
|
|
|
## Justification
|
|
|
|
### Avantages du Mono-repo
|
|
|
|
#### 1. **Cohérence**
|
|
- Documentation et code au même endroit
|
|
- Versioning unifié (1 tag = 1 version du projet)
|
|
- Évolution synchronisée des 2 applications
|
|
|
|
#### 2. **Collaboration Facilitée**
|
|
- Un seul repository à cloner
|
|
- Pull Requests centralisées
|
|
- CI/CD unique
|
|
|
|
#### 3. **Code Partagé**
|
|
- Types TypeScript communs (`packages/shared-types`)
|
|
- Utilitaires réutilisables
|
|
- Constantes (entrepôts, catégories)
|
|
|
|
#### 4. **Simplicité Opérationnelle**
|
|
- 1 seul `.git` à gérer
|
|
- 1 seul CI/CD à configurer
|
|
- Déploiement simplifié
|
|
|
|
#### 5. **Pédagogique**
|
|
- Comparaison immédiate (côte à côte)
|
|
- Navigation facile entre Legacy et Moderne
|
|
- Historique Git complet
|
|
|
|
### Pourquoi pnpm ?
|
|
|
|
| Critère | npm | yarn | pnpm |
|
|
|---------|-----|------|------|
|
|
| **Performance** | ⚠️ Moyen | ✅ Rapide | ✅ Très rapide |
|
|
| **Espace disque** | ❌ Duplication | ⚠️ Cache | ✅ Hard links |
|
|
| **Workspaces** | ✅ Oui | ✅ Oui | ✅ Oui + strict |
|
|
| **Popularité** | ✅✅✅ | ✅✅ | ✅ Croissante |
|
|
|
|
**pnpm** est optimal pour les mono-repos :
|
|
- Installation ultra-rapide (hard links)
|
|
- Économie d'espace disque (1 seule copie par package)
|
|
- Mode strict (pas de phantom dependencies)
|
|
|
|
---
|
|
|
|
## Conséquences
|
|
|
|
### ✅ Positives
|
|
|
|
- Navigation projet simplifiée
|
|
- Refactoring inter-apps facile
|
|
- Documentation toujours à jour
|
|
- CI/CD centralisé
|
|
- Onboarding rapide (1 clone)
|
|
|
|
### ⚠️ Négatives
|
|
|
|
- Repository plus volumineux
|
|
- Git history peut devenir complexe
|
|
- Risque de couplage involontaire (à surveiller)
|
|
|
|
### 🛠️ Mitigations
|
|
|
|
- Utiliser `pnpm --filter` pour travailler sur une app
|
|
- Structurer clairement les dossiers
|
|
- Code reviews strictes (pas de couplage)
|
|
- Git hooks pour validation
|
|
|
|
---
|
|
|
|
## Structure Adoptée
|
|
|
|
```
|
|
bricoloc-architecture-evolution/
|
|
├── apps/
|
|
│ ├── legacy-app/ # Application Legacy isolée
|
|
│ └── modern-app/ # Application Moderne isolée
|
|
├── packages/
|
|
│ └── shared-types/ # Types partagés (si nécessaire)
|
|
├── docs/ # Documentation centralisée
|
|
├── tools/ # Scripts communs
|
|
├── pnpm-workspace.yaml # Configuration workspace
|
|
└── package.json # Root package.json
|
|
```
|
|
|
|
---
|
|
|
|
## Alternatives Rejetées
|
|
|
|
### ❌ Multi-repo (3 repositories séparés)
|
|
|
|
**Raisons du rejet** :
|
|
- Complexité de synchronisation
|
|
- Difficulté de comparaison Legacy vs Moderne
|
|
- Multiplication des CI/CD
|
|
- Onboarding plus long
|
|
|
|
### ❌ Mono-repo avec Git submodules
|
|
|
|
**Raisons du rejet** :
|
|
- Complexité Git (submodules = source d'erreurs)
|
|
- Pas adapté pour projet académique
|
|
- Overhead de gestion
|
|
|
|
### ❌ npm/yarn workspaces
|
|
|
|
**Raisons du rejet** :
|
|
- pnpm plus performant
|
|
- pnpm mode strict évite les erreurs
|
|
- Économie d'espace significative
|
|
|
|
---
|
|
|
|
## Références
|
|
|
|
- [pnpm Workspaces Documentation](https://pnpm.io/workspaces)
|
|
- [Monorepo vs Multi-repo](https://www.atlassian.com/git/tutorials/monorepos)
|
|
- [Why pnpm?](https://pnpm.io/motivation)
|
|
|
|
---
|
|
|
|
## Validations
|
|
|
|
- [x] Discussion équipe
|
|
- [x] POC pnpm workspace
|
|
- [x] Alignement avec contraintes académiques
|
|
|
|
---
|
|
|
|
**Prochaine révision** : Si problème majeur détecté
|