Monorepo & NX¶
C'est quoi un monorepo ?¶
Explication simple : Un monorepo, c'est comme une grande boîte où l'on range tous les projets ensemble. Au lieu d'avoir 3 dossiers séparés sur votre ordinateur (un pour group, un pour tech, un pour immo), tout est au même endroit. C'est plus facile à gérer et à synchroniser.
Polyrepo vs Monorepo — comparaison¶
graph TB
subgraph polyrepo["❌ Polyrepo (3 dépôts séparés)"]
R1[repo: drwh_group]
R2[repo: drwh_tech]
R3[repo: drwh_immo]
end
subgraph monorepo["✅ Monorepo (drwh_front)"]
M[drwh_front/\ndrwh_group\ndrwh_tech\ndrwh_immo]
end
style polyrepo fill:#ffebee,stroke:#e74c3c
style monorepo fill:#e8f5e9,stroke:#27ae60
style R1 fill:#e74c3c,color:#fff
style R2 fill:#e74c3c,color:#fff
style R3 fill:#e74c3c,color:#fff
style M fill:#27ae60,color:#fff
| Critère | Polyrepo | Monorepo (drwh_front) |
|---|---|---|
| Gestion des versions | Chaque repo a sa propre version | Version unifiée pour tous les services |
| Partage de code | Complexe (packages npm privés…) | Facile (import direct depuis lib partagée) |
| Refactoring | Pénible (modifier 3 repos) | Simple (un seul endroit) |
| CI/CD | Pipeline séparé par repo | Un seul pipeline, build intelligent |
| Découverte du code | Chercher dans 3 repos | Tout dans un seul dossier |
Structure du monorepo drwh_front¶
drwh_front/ ← Racine du monorepo
│
├── apps/ ← Les applications
│ ├── drwh_group/ ← Site Group (Laravel/PHP)
│ ├── drwh_tech/ ← Site Tech (Next.js)
│ ├── drwh_tech-e2e/ ← Tests end-to-end de drwh_tech
│ ├── drwh_immo/ ← Site Immo (Next.js)
│ └── drwh_immo-e2e/ ← Tests end-to-end de drwh_immo
│
├── docs/ ← Cette documentation (MkDocs)
│
├── infra/ ← Infrastructure
│ └── nginx/ ← Configuration Nginx
│ ├── nginx.conf
│ ├── conf.d/
│ ├── certs/ ← Certificats TLS
│ └── www/ ← Webroot ACME
│
├── scripts/ ← Scripts utilitaires
│ └── vercel-build.js ← Build Vercel
│
├── nx.json ← Configuration NX
├── package.json ← Dépendances JS globales (racine)
├── tsconfig.base.json ← TypeScript partagé
├── docker-compose.yml ← Orchestration Docker
├── Dockerfile.tech ← Image Docker drwh_tech
├── Dockerfile.immo ← Image Docker drwh_immo
└── Dockerfile.group ← Image Docker drwh_group
NX : le chef d'orchestre¶
Explication simple : NX, c'est comme un chef d'orchestre dans un concert. Les musiciens (les services) jouent chacun leur partition, mais c'est le chef qui dit "maintenant vous démarrez", "maintenant vous vous arrêtez", "maintenant vous passez en production".
graph TD
NX[🎼 NX\nChef d'orchestre] -->|nx run drwh_tech:serve| T[💻 drwh_tech]
NX -->|nx run drwh_immo:build| I[🏗️ drwh_immo]
NX -->|nx run drwh_group:serve| G[🏠 drwh_group]
NX -->|nx affected --target=test| Tests[🧪 Tests intelligents\nSeulement ce qui a changé]
NX -->|nx graph| Graph[📊 Graphe des dépendances\nentre projets]
style NX fill:#0066FF,color:#fff,stroke:#004E89
style T fill:#27ae60,color:#fff
style I fill:#f39c12,color:#fff
style G fill:#e74c3c,color:#fff
style Tests fill:#8e44ad,color:#fff
style Graph fill:#2d2e2e,color:#fff
Ce que NX permet de faire¶
| Fonctionnalité | Description | Commande exemple |
|---|---|---|
| Servir | Lancer un service en mode développement | npx nx serve drwh_tech |
| Builder | Compiler pour la production | npx nx build drwh_immo |
| Tester | Lancer les tests unitaires | npx nx test drwh_tech |
| Linter | Vérifier la qualité du code | npx nx lint drwh_immo |
| Cache intelligent | Ne refait que ce qui a changé | Automatique |
| Graphe | Visualiser les dépendances | npx nx graph |
| Build affecté | Build uniquement les projets impactés | npx nx affected --target=build |
Le fichier nx.json¶
C'est le fichier de configuration principal de NX, situé à la racine du monorepo.
{
"$schema": "./node_modules/nx/schemas/nx-schema.json",
"defaultBase": "main",
"targetDefaults": {
"build": {
"cache": true,
"dependsOn": ["^build"]
},
"test": {
"cache": true
}
}
}
Le cache NX
NX garde en cache les résultats des builds et tests. Si vous n'avez rien modifié dans un service, NX ne le rebuild pas — il utilise le cache. Cela accélère considérablement les déploiements.
Pour vider le cache : `npx nx reset`
Le fichier project.json¶
Chaque service a son propre fichier project.json qui décrit comment NX doit le gérer.
Exemple pour drwh_tech :
{
"name": "drwh_tech",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "apps/drwh_tech/src",
"projectType": "application",
"targets": {
"build": {
"executor": "@nx/next:build",
"options": {
"outputPath": "dist/apps/drwh_tech"
}
},
"serve": {
"executor": "@nx/next:server",
"options": {
"buildTarget": "drwh_tech:build",
"port": 4201
}
}
}
}
Commandes NX essentielles¶
````bash # Lancer tous les services npm run dev
# Lancer un service spécifique
npx nx serve drwh_tech
npx nx serve drwh_immo
# Lancer drwh_group (Laravel, via npm script)
npm run dev:group
```
```bash # Builder tous les services npm run build
# Builder un seul service
npx nx build drwh_tech
npx nx build drwh_immo
# Builder seulement les services affectés par les changements
npx nx affected --target=build
```
```bash # Tous les tests npm run test
# Tests d'un service
npx nx test drwh_tech
# Tests end-to-end
npx nx e2e drwh_tech-e2e
```
```bash # Vider le cache NX (si comportement bizarre) npx nx reset
# Voir le graphe des dépendances (ouvre dans le navigateur)
npx nx graph
# Lister tous les projets du workspace
npx nx show projects
```