Monorepositório com C#: organização de código e melhores práticas
No desenvolvimento moderno em C# (.NET), a abordagem de monorepositório (monorepo) é cada vez mais utilizada. Ao contrário dos multirrepositórios, onde cada projeto vive no seu próprio repositório Git, um monorepositório armazena todo o código da empresa ou produto em um único repositório central. Para desenvolvedores .NET, isso significa uma única solução (solution), bibliotecas compartilhadas e configuração simplificada de CI/CD. Neste artigo, vamos analisar como organizar corretamente um monorepositório com C#, fornecer exemplos de código e discutir as principais vantagens.
1. Vantagens do monorepositório para .NET
O monorepositório é especialmente útil para equipes que trabalham em vários projetos .NET relacionados: microsserviços, aplicações web, bibliotecas de classes. Os principais benefícios são:
- Versão única de dependências — todos os projetos usam as mesmas versões de pacotes NuGet, eliminando conflitos.
- Refatoração simplificada — a alteração de uma interface comum ou modelo de dados é aplicada imediatamente a todos os consumidores.
- Histórico Git compartilhado — commits atômicos que afetam vários projetos são visíveis em um só lugar.
- CI/CD centralizado — um único pipeline para compilação, teste e implantação de todos os componentes.
Para C#, o monorepositório é construído em torno de um único arquivo .sln (solution), que referencia todos os projetos. Isso permite usar as ferramentas integradas do Visual Studio e .NET CLI para gerenciar dependências.
2. Estrutura do monorepositório para C#
Vamos considerar uma estrutura típica de monorepositório para uma solução .NET. Ela pode ser assim:
MyCompany/├── src/│ ├── MyCompany.Common/ # Biblioteca compartilhada│ │ ├── MyCompany.Common.csproj│ │ └── ...│ ├── MyCompany.WebApi/ # Web API│ │ ├── MyCompany.WebApi.csproj│ │ └── ...│ └── MyCompany.BackgroundJob/ # Serviço em segundo plano│ ├── MyCompany.BackgroundJob.csproj│ └── ...├── tests/│ ├── MyCompany.Common.Tests/│ ├── MyCompany.WebApi.Tests/│ └── MyCompany.BackgroundJob.Tests/├── docs/ # Documentação├── scripts/ # Scripts para CI/CD├── .gitignore└── MyCompany.sln # Solução únicaElementos-chave desta estrutura:
- src/ — pasta com o código-fonte. Cada projeto é uma pasta separada com seu próprio arquivo .csproj.
- tests/ — pasta com testes. Os nomes dos projetos de teste repetem os nomes dos principais com o sufixo .Tests.
- docs/ — documentação (README, decisões arquiteturais).
- scripts/ — scripts para automação de compilação ou implantação.
- MyCompany.sln — arquivo de solução único que inclui todos os projetos.
Essa estrutura simplifica a navegação e permite adicionar facilmente novos projetos sem alterar a configuração raiz.
3. Configuração da solução única e dependências compartilhadas
Para criar um monorepositório em .NET, use o comando dotnet new sln e, em seguida, adicione os projetos:
# Cria a pasta raiz e navega para elamkdir MyCompany && cd MyCompany
# Cria um arquivo de solução vaziodotnet new sln -n MyCompany
# Cria a estrutura de pastasmkdir src tests docs scripts
# Cria os projetosdotnet 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
# Adiciona os projetos à soluçãodotnet sln add src/MyCompany.Common/MyCompany.Common.csprojdotnet sln add src/MyCompany.WebApi/MyCompany.WebApi.csprojdotnet sln add src/MyCompany.BackgroundJob/MyCompany.BackgroundJob.csprojAgora vamos adicionar uma referência à biblioteca compartilhada a partir da Web API: