Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)
eixo vertical: equipe de engenharia - eixo horizontal: releases
Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)
eixo vertical: tamanho do produto - eixo horizontal: releases
Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)
Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)
- Sir Tim Berners-Lee
Padronizar e organizar o código, favorecendo o reuso, independente de tecnologia ou solução
“Uma boa arquitetura torna o sistema fácil de entender, fácil de desenvolver, fácil de manter e fácil de implantar. O objetivo final é minimizar o custo de vida útil do sistema e maximizar a produtividade do programador.”
― Robert C. Martin, Arquitetura Limpa
domain
domain
data
ui
Portanto, a adoção de um monorepo geralmente permite mais flexibilidade de implantação.
O monorepo
Um repositório único com vários projetos distintos e relacionamentos bem definidos entre eles
Considere um repositório com vários projetos nele.
Se não houver relacionamentos bem definidos entre eles, não o chamaríamos de monorepo.
Projetos dependem uns dos outros, para que possam compartilhar código.
Em alterações, não "buildamos" nem testamos todos os projetos, apenas executamos novamente projetos que podem ser afetados pela alteração em questão...
Isso torna o CI mais rápido, em grande escala isso pode significar 1000 vezes mais rápido.
Dá independência às equipes que estão trabalhando.
Se o projeto A e B não dependem um do outro, eles não podem afetar um ao outro – nunca.
E eles vêm com seus próprios desafios.
mais informações em:
Nem todos os serviços funcionam com ele
Cada novo repo significa:
Isso, esquecendo versões incompatíveis de bibliotecas de terceiros entre eles...
Cada novo repo significa:
Geralmente repositórios compartilhados acabam por ficar orfãos
Com monorepo significa:
E nem falamos nas facilidades em novos apps e pacotes usando geradores
Com monorepo significa:
A equipe A poderá desenvolver seu projeto, testa-lo, mesclar PR's na main sem nunca precisar executar nenhum código escrito pela equipe B.
Portanto, a equipe B pode ter testes irregulares, código mal escrito ou quebrando testes, nada disso importa para a equipe A.
Bibliotecas que implementam UI inteligentes...
Contém apenas componentes de apresentação ou "burros"...
Biblioteca de acesso a dados contém código para interagir com um sistema de back-end.
Também inclui todo o código relacionado à gestão do estado.
Contém utilitários de baixo nível usados por muitas bibliotecas e aplicativos.
domain
domain
data
ui
styles, components
services, facades
repo, usecases
entities, dtos
{
"name": "@meetup/source",
"version": "0.0.0",
"license": "MIT",
"scripts": {},
"private": true,
"dependencies": {},
"devDependencies": {
"@nx/js": "19.0.6",
"@nx/workspace": "19.0.6",
"nx": "19.0.6"
}
}
Podemos definir relações entre projetos, e isso é de extrema importância para que todas as equipes que trabalham no repositório continuem seguindo os padrões estabelecidos.
{
"enforceBuildableLibDependency": true,
"allow": [],
"depConstraints": [
{
"sourceTag": "type:data",
"onlyDependOnLibsWithTags": [
"type:domain"
]
},
{
"sourceTag": "type:domain",
"onlyDependOnLibsWithTags": [
"type:util"
]
},
{
"sourceTag": "type:ui",
"onlyDependOnLibsWithTags": [
"type:ui",
"type:util"
]
},
{
"sourceTag": "type:util",
"onlyDependOnLibsWithTags": [
"type:util"
]
},
{
"sourceTag": "type:feature",
"onlyDependOnLibsWithTags": [
"type:data",
"type:ui",
"type:util"
]
},
{
"sourceTag": "type:shell",
"onlyDependOnLibsWithTags": [
"type:feature",
"type:data",
"type:ui",
"type:util"
]
},
{
"sourceTag": "type:app",
"onlyDependOnLibsWithTags": [
"type:shell",
"type:feature",
"type:domain",
"type:data",
"type:ui",
"type:util"
]
}
]
}