Foto de Charlotte Coneybeer na Unsplash

Como criar um monorepo utilizando o Turborepo

Vinnicius Gomes

--

Você já se deparou com a questão de como organizar o código-fonte de um projeto grande e complexo? Se sim, você provavelmente já ouviu falar sobre o monorepo, uma abordagem que está se tornando cada vez mais popular entre equipes de desenvolvimento de software. Mas o que exatamente é um monorepo e como ele pode ajudar no gerenciamento de código?

Nesse post vou te mostrar como eu crio meus monorepos utilizando o Turborepo, mas antes de mais nada, vamos entender o que é um monorepo.

O que é um monorepo?

Imagem retirada desse artigo: https://dev.to/stanley/monorepo-o-que-e-devo-usar-133c

Um monorepo, ou repositório monolítico, é uma abordagem de gerenciamento de código em que todo o código-fonte de um projeto é armazenado em um único repositório de versionamento de código. Isso significa que todas as partes do projeto, seja o backend, frontend, serviços, bibliotecas compartilhadas e muito mais, estão todos centralizados em um só lugar.

Em contraste com a abordagem de vários repositórios (multi-repo), onde cada componente ou parte do projeto tem seu próprio repositório separado, o monorepo coloca tudo em um só lugar. Isso pode incluir todo o código-fonte, bem como testes, configurações de build, documentação e outras partes relacionadas ao desenvolvimento do software.

Não é só juntar tudo em um repositório que você tem um monorepo!

Embora a definição básica de um monorepo seja simples — colocar todo o código de um projeto em um único repositório —, a verdadeira essência de um monorepo vai muito além disso. Não se trata apenas de juntar todos os arquivos em um só lugar, mas sim de criar uma estrutura organizada e eficiente que permita a colaboração e o desenvolvimento contínuo do projeto.

Benefícios de um monorepo

Existem várias vantagens potenciais de um monorepo em relação a repositórios individuais:

  1. Facilidade de reutilização de código: Uma das maiores vantagens de um monorepo é a facilidade de reutilização de código. Funcionalidades similares podem ser encapsulados em bibliotecas compartilhadas, que podem ser diretamente incluídas por diferentes projetos. Isso elimina a necessidade de gerenciadores de pacotes de dependência como o npm, simplificando o processo de integração e promovendo a coesão do código em todo o do projeto.
  2. Sem sobrecarga para criar novos projetos: Ao utilizar um monorepo, não há sobrecarga para criar novos projetos. A infraestrutura de Integração Contínua (CI) já existente pode ser facilmente aproveitada, e não é necessário publicar pacotes versionados, especialmente se todos os consumidores estiverem no mesmo repositório. Isso reduz significativamente a burocracia e o tempo necessário para iniciar novos projetos, permitindo que as equipes se concentrem mais na criação de valor e menos na configuração de ambientes.
  3. Commits atômicos em todos os projetos: Uma característica fundamental de um monorepo é a capacidade de realizar commits atômicos em todos os projetos. Isso significa que todas as alterações são integradas e testadas em conjunto, garantindo que tudo funcione perfeitamente a cada commit. Não existe o conceito de uma mudança quebrada, pois todas as correções e melhorias são implementadas de forma consistente e abrangente em todo o código-base. Isso promove a estabilidade do sistema e aumenta a confiança dos desenvolvedores durante o processo de desenvolvimento.
  4. Visibilidade: No ambiente de um monorepo, a visibilidade é maximizada. Todos os membros da equipe têm acesso ao código de todos os outros projetos, o que promove a transparência e a colaboração. Isso facilita a identificação e resolução de problemas, permite a troca de conhecimento e promove um senso de responsabilidade compartilhada pelo código em todo o projeto.

Desvantagens de um monorepo

Enquanto as vantagens de um monorepo são claras, é importante também reconhecer e entender os desafios que podem surgir ao escolher essa abordagem. Aqui estão alguns dos principais desafios a serem considerados:

  1. Desempenho Inferior: Um dos principais desafios enfrentados pelos monorepos é o desempenho inferior em comparação com repositórios menores. À medida que o tamanho do monorepo aumenta, certas operações do Git, como git blame, podem levar tempos consideráveis, tornando a análise de código e a resolução de problemas mais demoradas. Isso pode afetar a produtividade da equipe e dificultar a identificação rápida de responsabilidades em partes específicas do código.
  2. Problemas na branch principal: Em um monorepo, um erro na branch principal afeta todos os membros da equipe que trabalham no projeto. Se a branch master estiver quebrada, todos os desenvolvedores serão impactados, o que pode levar a atrasos significativos no desenvolvimento e na entrega de novos recursos. Manter a integridade da branch principal é crucial para garantir a estabilidade e a confiabilidade do monorepo como um todo.
  3. Git clone lento: À medida que o monorepo cresce em tamanho, o processo de clone do repositório usando o Git pode se tornar significativamente mais lento. Isso ocorre devido ao grande volume de dados que precisam ser transferidos durante a clonagem, o que pode levar a tempos de espera prolongados para os desenvolvedores que estão tentando configurar um ambiente de desenvolvimento local. Essa lentidão na clonagem pode afetar a produtividade da equipe, especialmente para novos membros que precisam configurar o ambiente pela primeira vez.
  4. Tempo de build pode ser demorado: Com um grande número de arquivos e código-fonte em um monorepo, o tempo necessário para construir e testar o projeto pode se tornar significativamente mais longo. O processo de compilação e execução de testes pode ser afetado pela complexidade do projeto e pelo volume de código a ser processado. Isso pode resultar em tempos de construção mais demorados, o que pode impactar a rapidez com que as alterações são implementadas e testadas, bem como a frequência das entregas de software.

O que é o Turborepo?

https://turbo.build/repo

O Turborepo, é um sistema de construção de alto desempenho para bases de código em JavaScript e TypeScript, foi criado por Jared Palmer como uma oferta de software empresarial de código fechado. No final de 2021, a Vercel adquiriu o Turborepo e tornou o código-fonte aberto.

O que o Turborepo faz?

  1. Construções mais rápidas e incrementais: Construir uma vez já é doloroso o suficiente, o Turborepo lembrará o que você já construiu e ignorará o que já foi computado.
  2. Cache em nuvem: Compartilhe um cache de construção em nuvem com seus colegas de equipe e CI/CD para construções ainda mais rápidas.
  3. Execução paralela: Execute construções usando todos os núcleos com máxima paralelização sem desperdiçar CPUs ociosas.
  4. Pipelines de tarefas: Defina as relações entre suas tarefas e deixe o Turborepo otimizar o que construir e quando.

Por que escolher o Turborepo?

O Turborepo se destaca por várias razões:

  1. Desempenho: O Turborepo otimiza o processo de construção, reconstruindo apenas os pacotes que foram alterados, acelerando os tempos de construção em monorepos grandes.
  2. Simplicidade: Com uma API simples e intuitiva, o Turborepo é fácil de aprender e usar, simplificando o fluxo de trabalho de desenvolvimento.
  3. Flexibilidade e compatibilidade: O Turborepo suporta tanto JavaScript quanto TypeScript, é compatível com qualquer sistema de construção e funciona com qualquer gerenciador de pacotes, incluindo npm, yarn e pnpm.
  4. Testes eficientes: O Turborepo pode executar testes em todos os pacotes, apenas nos pacotes alterados ou nos pacotes alterados e seus dependentes, tornando seu processo de teste mais eficiente.

Criando um monorepo com o Turborepo

Agora vamos ao que importa, que é criar o nosso monorepo utilizando todo o poder do Turborepo!

1º passo— Para criar um monorepo é super simples, com a ajuda da CLI do Turborepo precisamos rodar apenas um comando: pnpm dlx create-turbo@latest

pnpm dlx create-turbo@latest

2º passo — Digite o nome do seu monorepo e selecione seu workspace, no meu caso vou utilizar o pnpm workspaces

pnpm dlx create-turbo@latest

E pronto, seu monorepo está pronto para ser utilizado, vamos dar uma olhada na estrutura que ele gerou:

Estrutura de arquivos geradas pela CLI

Essa é a estrutura inicial que o Turborepo gera, nela temos algumas pastas importantes:

/apps: Aqui que ficam suas aplicações, a CLI cria duas aplicações de exemplo, uma web e uma docs, duas aplicações utilizando o Next.js como exemplo, nessa pasta também ficaria sua API caso tivesse uma.

/packages: Essa pasta é responsável por agrupar os pacotes reutilizáveis da aplicação, então não é mais necessário fazer o deploy de um pacote no NPM para compartilhar ele entre as aplicações do seu monorepo, o próprio pnpm workspaces faz isso para você.

pnpm-worspace.yaml: Esse arquivo é responsável por expor os pacotes do seu monorepo, então toda vez que você quiser deixar algo reutilizável entre as aplicações, é aqui que você precisa configurar, e é super fácil:

pnpm-workspace.yaml

turbo.json: Esse é o arquivo de configuração do turborepo, é nele que você consegue fazer as customizações e configurações do seu monorepo. Existem muitas opções de configurações e não daria para cobrir todas em um post, mas a doc é bem completa e você pode consultar aqui:

package.json: O package.json na raiz do projeto é responsável por gerenciar as bibliotecas que são utilizadas pelo monorepo como um todo. Ele contém os scripts do turborepo que nos ajudam a subir as aplicações de uma forma super rápida:

package.json

Quando rodamos o script pnpm run dev, por exemplo, o turborepo sobe todos os nossos apps de uma vez, facilitando o processo de desenvolvimento:

pnpm run dev

Agora nossos dois apps estão rodando, o web em localhost:3000 e a doc na localhost:3001 com apenas um comando!

http://localhost:3000/

E também já utilizando nosso package de ui que é responsável por distribuir os componentes de interface da aplicação como o botão no print acima.

Pronto, agora você tem um monorepo configurado e pronto para ser enviado para o GitHub!

Deploy das aplicações na Vercel

Depois de ter criado nosso monorepo e subido ele para o GitHub, vamos para o deploy desse monorepo na Vercel — o deploy pode ser feito em qualquer outra cloud, vou utilizar a Vercel apenas como exemplo — , e para fazer isso é super simples também!

Caso você não tenha uma conta, só criar no link abaixo:

O deploy dos apps do monorepo é feito de forma individual, ou seja, vamos ter um deploy para o web e um para o docs

Vamos ao que importa, no exemplo abaixo vamos fazer o deploy do web, o processo é o mesmo para fazer o deploy do docs!

1º passo — Selecionar o repositório do GitHub

https://vercel.com/new

2º passo — Selecione o app para fazer o deploy

Clique no edit e escolha o diretório web:

3º passo — Deploy

A Vercel lida com todos os aspectos da configuração do seu monorepo, incluindo a configuração dos comandos de construção , o Diretório de saída , o Diretório raiz , o diretório correto para os workspaces e a Etapa de construção ignorada.

Então é só clicar em deploy e ver a mágica acontecer!

Deploy feito 🎉

Simples assim!

Conclusão

O assunto monorepo não é novo, e é muito utilizado por grandes empresas de tecnologias. O Turborepo é um grande facilitador para implementar essa estratégia, e é utilizado por grandes empresas do mercado:

Fonte: https://vercel.com

Em resumo, o Turborepo se destaca como uma ferramenta poderosa para simplificar e acelerar o desenvolvimento em monorepos. Com recursos como builds incrementais mais rápidos, cache em nuvem compartilhado e execução paralela eficiente, ele oferece uma solução completa para os desafios específicos enfrentados por equipes que trabalham em projetos de grande escala.

Ao escolher o Turborepo, você pode melhorar significativamente sua produtividade e eficiência, reduzindo o tempo necessário para construir, testar e implantar seus aplicativos. Além disso, como uma ferramenta de código aberto, o Turborepo oferece a flexibilidade e a transparência necessárias para atender às demandas em constante evolução do desenvolvimento de software.

Portanto, se você está enfrentando os desafios de gerenciar um monorepo e está buscando uma solução que ofereça desempenho excepcional e facilidade de uso, o Turborepo é uma escolha que vale a pena considerar.

Eu criei um repositório no GitHub com a aplicação criada nesse post, se você quiser dar uma olhada mais a fundo é só clicar aqui:

Bom, é isso, espero que tenha gostado! E se tiver alguma sugestão deixe aí nos comentários 💬

Se gostou, dê 1 ou 50 claps (Só clicar 50x na 👏)

Obrigado pela leitura!

Me acompanhe por aí! 😜

--

--

Vinnicius Gomes
Vinnicius Gomes

Written by Vinnicius Gomes

Senior Software Engineer who love to write about Frontend, JavaScript and Web development. See more about me — vinniciusgomes.dev

No responses yet