Monorepo avec C# : organisation du code et bonnes pratiques
Dans le développement moderne en C# (.NET), l'approche du monorepo est de plus en plus utilisée. Contrairement aux multi-repos, où chaque projet vit dans son propre dépôt Git, un monorepo stocke tout le code de l'entreprise ou du produit dans un seul dépôt central. Pour les développeurs .NET, cela signifie une solution unique, des bibliothèques partagées et une configuration CI/CD simplifiée. Dans cet article, nous verrons comment organiser correctement un monorepo avec C#, fournirons des exemples de code et discuterons des principaux avantages.
1. Avantages du monorepo pour .NET
Le monorepo est particulièrement utile pour les équipes travaillant sur plusieurs projets .NET connexes : microservices, applications web, bibliothèques de classes. Les principaux avantages :
- Version unique des dépendances — tous les projets utilisent les mêmes versions des packages NuGet, ce qui élimine les conflits.
- Refactoring simplifié — la modification d'une interface commune ou d'un modèle de données s'applique immédiatement à tous les consommateurs.
- Historique Git partagé — les commits atomiques qui affectent plusieurs projets sont visibles au même endroit.
- CI/CD centralisée — un seul pipeline pour la construction, les tests et le déploiement de tous les composants.
Pour C#, un monorepo est construit autour d'un seul fichier .sln (solution) qui référence tous les projets. Cela permet d'utiliser les outils intégrés de Visual Studio et .NET CLI pour la gestion des dépendances.
2. Structure d'un monorepo pour C#
Considérons une structure typique de monorepo pour une solution .NET. Elle pourrait ressembler à ceci :
MyCompany/├── src/│ ├── MyCompany.Common/ # Bibliothèque commune│ │ ├── MyCompany.Common.csproj│ │ └── ...│ ├── MyCompany.WebApi/ # API Web│ │ ├── MyCompany.WebApi.csproj│ │ └── ...│ └── MyCompany.BackgroundJob/ # Service d'arrière-plan│ ├── MyCompany.BackgroundJob.csproj│ └── ...├── tests/│ ├── MyCompany.Common.Tests/│ ├── MyCompany.WebApi.Tests/│ └── MyCompany.BackgroundJob.Tests/├── docs/ # Documentation├── scripts/ # Scripts pour CI/CD├── .gitignore└── MyCompany.sln # Solution uniqueLes éléments clés de cette structure :
- src/ — dossier contenant le code source. Chaque projet est un dossier séparé avec son propre fichier .csproj.
- tests/ — dossier contenant les tests. Les noms des projets de test reprennent ceux des projets principaux avec le suffixe .Tests.
- docs/ — documentation (README, décisions architecturales).
- scripts/ — scripts pour l'automatisation de la construction ou du déploiement.
- MyCompany.sln — fichier de solution unique qui inclut tous les projets.
Cette structure simplifie la navigation et permet d'ajouter facilement de nouveaux projets sans modifier la configuration racine.
3. Configuration d'une solution unique et des dépendances partagées
Pour créer un monorepo dans .NET, utilisez la commande dotnet new sln, puis ajoutez les projets :
# Créez le dossier racine et accédez-ymkdir MyCompany && cd MyCompany
# Créez un fichier de solution videdotnet new sln -n MyCompany
# Créez la structure de dossiersmkdir src tests docs scripts
# Créez les projetsdotnet new classlib -n MyCompany.Common -o src/MyCompany.Commondotnet new webapi -n MyCompany.WebApi -o src/MyCompany.WebApidotnet new console -n MyCompany.BackgroundJob -o src/MyCompany.BackgroundJob
# Ajoutez les projets à la solutiondotnet sln add src/MyCompany.Common/MyCompany.Common.csprojdotnet sln add src/MyCompany.WebApi/MyCompany.WebApi.csprojdotnet sln add src/MyCompany.BackgroundJob/MyCompany.BackgroundJob.csprojAjoutons maintenant une référence à la bibliothèque commune depuis l'API Web :