Tudo sobre Monorepo
(monorepo.tools)O que é Monorepo
- “Vários projetos individuais reunidos em um único repositório por meio de relações bem definidas”
- Monorepo ≠ Monolith
Por que adotar?
- O motivo para escolher o modelo Polyrepo existente (usar vários repositórios) era a “autonomia das equipes (team autonomy)”
- As equipes podiam escolher as bibliotecas que quisessem e decidir quem contribui e quem usa o código
- PolyRepo
- Compartilhar código é trabalhoso
- Há muita duplicação de código
- Bugs críticos e grandes mudanças em bibliotecas compartilhadas têm custo alto
- Uso inconsistente de ferramentas de desenvolvimento entre projetos
- Monorepo
- Não há overhead para criar novos projetos
- Commits atômicos em todo o conjunto de projetos
- Tudo é gerenciado com um único número de versão
- Mobilidade de desenvolvedores (movimentação entre projetos)
Recursos oferecidos pelas ferramentas de Monorepo e comparação entre elas
→ Bazel, Gradle, Lage, Lerna, Nx, Rush, Turborepo
- Cache local
- Orquestração local de tarefas
- Cache distribuído
- Execução distribuída de tarefas
- Execução remota transparente
- Detecção de projetos/pacotes impactados
- Análise de workspace
- Visualização do grafo de dependências
- Compartilhamento de código
- Tooling consistente
- Geração de código
- Restrições e visibilidade de projetos
Mudança de mentalidade
Monorepo muda a forma como você pensa sobre sua “organização e seu código”
- Adicionando consistência,
- reduzindo o atrito ao criar novos projetos ou realizar grandes refatorações,
- promovendo o compartilhamento de código e a colaboração entre equipes,
- a organização pode trabalhar com mais eficiência
Existem várias soluções, mas cada uma tem objetivos diferentes
- Bazel (by Google) : “A fast, scalable, multi-language and extensible build system.”
- Gradle (by Gradle, Inc) : “A fast, flexible polyglot build system designed for multi-project builds.”
- Lage (by Microsoft) : “Task runner in JS monorepos”
- Lerna : “A tool for managing JavaScript projects with multiple packages.”
- Nx (by Nrwl) : “Next generation build system with first class monorepo support and powerful integrations.”
- Rush (by Microsoft) : “Geared for large monorepos with lots of teams and projects. Part of the Rush Stack family of projects.”
- Turborepo (by Vercel) : “The high-performance build system for JavaScript & TypeScript codebases.”
4 comentários
Ao desenvolver aplicações e instalá-las para cada cliente,
alguns clientes acabam não querendo mais upgrades,
e outros às vezes pedem uma versão especial só para eles.
Então, à medida que esses clientes vão aumentando,
no fim o repositório fica cheio de dezenas de branches com versões customizadas para cada cliente.
Cada branch tem uma versão um pouco diferente.
Nessa situação, quando vejo textos sobre Monorepo... parece até um sonho. haha
Lembro que o Torvalds disse que, na maioria das situações, bibliotecas compartilhadas não são uma boa ideia.. Tenho aplicado isso recentemente, e há menos coisas compartilháveis do que eu esperava, enquanto os problemas de o sistema de build ficar todo enrolado são grandes, então acho que monorepo não é um sistema tão ideal quanto se espera..
Na época em que o subversion era o padrão, isso era algo simplesmente óbvio, então acho tudo isso meio irônico.
Também acho estranho que o assunto seja tratado apenas no contexto de desenvolvimento frontend.
A Microsoft criou até um sistema de arquivos virtual para que o git pudesse ser usado como o subversion, mas é triste que isso não tenha se popularizado.
Hoje em dia, às vezes tenho ainda mais a sensação de que as tecnologias ficam indo e voltando. Dá até aquele pensamento: “Ué, isso não é aquilo que antes não era tão bom assim?”... talvez eu já esteja há tempo demais nessa rotina. snif snif