Monorepo - Single Repository, many modules

oeduardoal

Eduardo Almeida

Posted on June 29, 2020

Monorepo - Single Repository, many modules

image

Part 1 - Monorepos, porquê dessa abordagem?

What and Why?

Um monorepo é um conceito de arquitetura, que basicamente é o que diz.

Em vez de gerenciar vários repositórios, você mantém todas as suas partes de código isoladas dentro de um repositório.

Monorepo não tem nada em comum com monolíticos.

Você pode manter Vários tipos de aplicativos lógicos em um repositório; por exemplo, um site e seu aplicativo para iOS.

Este conceito é relativamente antigo e apareceu cerca de uma década atrás.

Você pode perguntar, se ele existe há uma década, então por que esse assunto é tão popular agora?

Principalmente, ao longo dos últimos 5-6 anos, muitas coisas sofreram mudanças. ES6, pré-processadores SCSS, gerenciadores de tarefas, npm etc.

atualmente, para manter um pequeno aplicativo baseado no React, você precisa lidar com vários pacotes, suítes de testes, scripts de CI/CD, configurações do Docker sei lá o que mais.

Imagine que você precise manter várias apps.

Cada pacote precisará ter sua própria configuração de ambiente, significa que toda vez que você desejar criar um novo pacote, precisará tudo de novo, copiar todos os arquivos e assim por diante.

Outro exemplo, é se você precisar alterar algo build da aplicação por exemplo, vai precisar olhar cada repositório, fazer a correção, abrir um PR em todos eles, aguardar build em cada projeto, ver se deu certo..

Granularidade de configuracoes

Enfim, o torna muito lento. Nessas situacoes, faz sentido usar monorepo.

Em vez de ter muitos repositórios com suas próprias configurações, imagine ter uma fonte de verdade - o monorepo:

  • suite de testes
  • Centralizar configurações como eslint, CI/CD
  • Arquivo de configuração Docker
  • Configurações Webpack
  • Pacotes semelhantes em cada aplicativo
  • Executando comandos semelhantes
  • bibliotecas com componentes e vários pacotes

Não é um mundo de flores.

Vantagens

  • Um local para armazenar todas as configurações e testes.

    você pode configurar seu CI / CD e bundler uma vez. O mesmo vale para testes de unidade, e2e e integração - seu CI poderá iniciar todos os testes sem precisar lidar com configurações adicionais.

  • Refatorar facilmente recursos globais.

    Em vez de abrir um PR em cada repositório, ver qual ordem de alteração, abre em um só lugar.

  • Publicação de pacotes simplificada.

    Se você pretende criar um lib de components e publicar isso em um registry. e os comandos são os mesmo pra isso, vale a pena usar monorepo

  • Gerenciamento de dependência mais fácil. package.json

    Apenas um. Não é necessário reinstalar dependências em cada repositório sempre que você desejar atualizar suas dependências.

  • Reutilize o código com pacotes compartilhados, mas ainda sim isolados.

    O Monorepo permite que você reutilize seus pacotes de outros pacotes, mantendo-os isolados um do outro. 

Desvantagens

  • Não há como restringir o acesso apenas a algumas partes do aplicativo
  • Baixo desempenho do Git ao trabalhar em projetos de grande escala
  • Maior tempo de construção e configuração. Quanto mais coisas ter que configurar, build, eslint, tests...

Exemplos (Github)

Part 2 - Lerna

Introduction

A tool for managing JavaScript projects with multiple packages.

Realmente ajuda a lidar com versões, a configurar o workflow de pacotes, publicação pro npm ou github, etc. A principal ideia do Lerna é que o projeto tenha uma pasta packages, que contém todas as partes de código isoladas.

Quase todos os comandos do lerna funcionam assim: O comando é repetido para todos os pacotes, como se entrasse em cada pasta. Por exemplo, bump de versão, limpar projeto, instalar dependencias, build...

Using Lerna

Installing

npm install -g lerna // yarn global add lerna
Enter fullscreen mode Exit fullscreen mode

Init

lerna init // --independent or -i 

ls -l

-rw-r--r--  1 user  staff    288B Mar 16 12:06 .git
-rw-r--r--  1 user  staff    63B Mar 16 12:04 lerna.json
-rw-r--r--  1 user  staff    91B Mar 16 12:04 package.json
drwxr-xr-x  2 user  staff    64B Mar 16 12:04 packages
Enter fullscreen mode Exit fullscreen mode

lerna.json

{
  "packages": [
    "packages/*"
  ],
  "version": "0.0.0"
}
Enter fullscreen mode Exit fullscreen mode

Create package

lerna create my-package

lerna create my-module
Enter fullscreen mode Exit fullscreen mode

Bootstrap

lerna bootstap // will create links :)
Enter fullscreen mode Exit fullscreen mode

Exec

lerna exec -- ls // --scope or --ignore --
Enter fullscreen mode Exit fullscreen mode

Clean

lerna clean // delete node_modules
Enter fullscreen mode Exit fullscreen mode

Publish

lerna publish // for ci use --yes // npm publish and git tag
Enter fullscreen mode Exit fullscreen mode




Independent versioning


{
"packages": [
"packages/*"
],
"version": "independent",
}
Enter fullscreen mode Exit fullscreen mode




Show me the code

🚀

Links

https://blog.npmjs.org/post/186494959890/monorepos-and-npm

https://medium.com/@chris_14660/learnin-lerna-for-monorepos-in-node-js-5b577bdbf380

💖 💪 🙅 🚩
oeduardoal
Eduardo Almeida

Posted on June 29, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related