Ao trabalhar em projetos de software complexos, a escolha entre monorepo e polyrepo pode impactar significativamente a produtividade da sua equipe e a escalabilidade do código. Neste artigo, analisamos as diferenças, prós e contras de cada abordagem, e ajudamos você a entender qual é a certa para você.
O que são Monorepo e Polyrepo?
Monorepo
Um monorepo (repositório monolítico) é um único repositório que contém o código-fonte de múltiplos projetos, serviços ou pacotes, frequentemente relacionados entre si.
my-monorepo/ packages/ frontend/ backend/ shared/ package.json turbo.json
Polyrepo
Um polyrepo (múltiplos repositórios) significa que cada projeto, serviço ou pacote tem seu próprio repositório separado.
repos/ frontend/ package.json backend/ package.json shared/ package.json
Diferença Visual
Prós e Contras
Monorepo
Vantagens:
- Facilita o compartilhamento de código (ex.: bibliotecas compartilhadas).
- Refatoração atômica em múltiplos projetos.
- Gerenciamento centralizado de dependências e configurações.
Desvantagens:
- Pode ficar pesado conforme a base de código cresce.
- Requer ferramentas para gerenciar builds/testes parciais (ex.: Nx, Turborepo).
Polyrepo
Vantagens:
- Cada equipe/projeto é independente.
- Mais fácil de gerenciar para projetos pequenos.
- Permite políticas de acesso granulares.
Desvantagens:
- Mais difícil compartilhar código sem publicar pacotes.
- Refatoração entre repositórios é mais complexa.
- Possível duplicação de configurações.
Exemplo Prático: Monorepo com Turborepo
Suponha que você queira criar um monorepo com frontend e backend usando Turborepo.
1. Inicializar o monorepo
npx create-turbo@latest
2. Estrutura típica
my-monorepo/ apps/ web/ # frontend Next.js api/ # backend Node.js/Express packages/ ui/ # shared component library utils/ # shared functions turbo.json package.json
3. Exemplo de workspace em package.json
{ "private": true, "workspaces": [ "apps/*", "packages/*" ] }
4. Exemplo de importação de biblioteca compartilhada
Suponha que você tenha uma função em packages/utils/src/formatDate.ts:
// packages/utils/src/formatDate.ts export function formatDate(date: Date): string { return date.toLocaleDateString('en-US'); }
No frontend:
// apps/web/pages/index.tsx import { formatDate } from '@myorg/utils'; export default function Home() { return <div>Today is {formatDate(new Date())}</div>; }
Quando Escolher Monorepo?
- Equipes médias-grandes trabalhando em múltiplos projetos relacionados.
- Necessidade de compartilhar código e realizar refatorações em larga escala.
- Projetos que crescem rapidamente e requerem builds/testes otimizados.
Quando Escolher Polyrepo?
- Projetos pequenos ou independentes.
- Equipes separadas trabalhando em produtos diferentes.
- Políticas de acesso muito restritivas.
Conclusão
Não existe uma solução perfeita para todos. A escolha depende do tamanho da equipe, da complexidade do projeto e das necessidades de colaboração. O importante é estar ciente das compensações e escolher as ferramentas certas para gerenciar a complexidade.