5 applis dans un seul dépôt : le monorepo Turborepo d'un développeur solo
Comment gérer plusieurs applis et sites web dans un seul dépôt avec un monorepo Turborepo. Partage des configs communes, économies de build grâce au cache et déploiement par appli, vu du terrain.
L'essentiel
Quand on construit plusieurs applis seul, les configs s'éparpillent. Avec un monorepo Turborepo, on partage eslint et tsconfig via packages, le cache turbo évite de rebuilder les applis inchangées, et --filter permet de déployer appli par appli.
Sur cette page
Quand on construit des applis seul, les dépôts se multiplient à toute vitesse. Une appli, un site web, encore une appli… et on se retrouve à copier-coller la config eslint cinq fois. Moi, j'ai tout fusionné dans un seul monorepo.
Le vrai problème, ce sont les configs éparpillées
Avec beaucoup de dépôts, ce qui fait le plus mal, ce n'est pas le code mais la config.
- eslint, prettier, tsconfig copiés dans chaque dépôt
- Un changement de règle, et il faut faire le tour de tous les dépôts
- Les UI et utilitaires communs sont trop anecdotiques pour être publiés sur npm
Le monorepo transforme tout ça en partage depuis un seul endroit.
Structure de base
apps/
├── web/ # 랜딩
├── blog/ # 이 블로그
├── wave/ # 오늘의 파도
└── ...
packages/
├── eslint-config/ # 공용 eslint
└── typescript-config/ # 공용 tsconfig
apps/* contient les livrables déployés, packages/* les configs et le code partagés entre applis. Le tsconfig.json de chaque appli se contente d'hériter.
{ "extends": "@repo/typescript-config/nextjs.json" }
Désormais, les règles se corrigent à un seul endroit : packages.
Le cache turbo, c'est la clé
La vraie arme de Turborepo, c'est le cache. Si les entrées d'une tâche (sources, config) n'ont pas changé, le résultat précédent est réutilisé tel quel.
turbo run build # 전체 빌드(바뀐 것만 실제로 돎)
turbo run build --filter=blog # blog 앱만
Il suffit de déclarer dans turbo.json les dépendances entre tâches et leurs sorties.
{
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": [".next/**"] }
}
}
À partir du deuxième build, tout se termine en quelques secondes avec un « FULL TURBO ».
Déployer appli par appli
Même dans un dépôt unique, les déploiements restent séparés par appli. Avec Docker, turbo prune extrait uniquement le sous-arbre de l'appli concernée pour alléger l'image.
turbo prune blog --docker # blog + 내부 의존성만 남긴 out/ 생성
Ce blog aussi a été découpé de cette façon et déployé en Docker sur un mini PC. Cette histoire est racontée dans l'article sur l'auto-hébergement.
En résumé
apps/*= livrables,packages/*= configs partagées- tsconfig et eslint gérés à un seul endroit par héritage
- Le cache
turbone rebuild pas les applis inchangées --filteretprunepour déployer appli par appli
Si vous faites tourner plusieurs produits seul, le monorepo n'est pas un luxe : c'est un outil de survie.
Questions fréquentes
À partir de combien d'applis le monorepo devient-il rentable ?
Dès plus de 2, à partir du moment où des configs communes (eslint, tsconfig, UI) apparaissent. L'essentiel : corriger la config à un seul endroit et la voir se propager à toutes les applis.
Les builds ne deviennent-ils pas plus lents ?
Au contraire, ils accélèrent. turbo met en cache le résultat des tâches dont les entrées n'ont pas changé, et ne rebuild que les applis modifiées.
Articles similaires
- 💻 Dev
Construire un blog MDX avec Next.js : comment ce blog a été fait
Comment j'ai construit un blog qui tourne uniquement avec des fichiers markdown, sans CMS, avec Next.js 16 et l'App Router. Structure des dossiers, config MDX et SEO, avec le vrai flux de code.
- 💻 Dev
Auto-hébergement sur mini PC avec Docker + Cloudflare Tunnel
Comment exposer plusieurs services web en toute sécurité avec un seul mini PC à la maison. HTTPS via Cloudflare Tunnel sans ouvrir de port, et tout tourne avec Docker Compose.
- ☕ Quotidien
La routine quotidienne d'un développeur solo : comment tenir sans s'épuiser
Travailler seul, sans patron ni collègues, c'est la liberté, mais on s'épuise vite. Voici la routine quotidienne et les quelques règles que je suis pour ne pas perdre le rythme.