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)
Padronizar e organizar o código, favorecendo o reuso, independente de tecnologia ou solução
domain
domain
data
ui
Um repositório único com vários projetos distintos e relacionamentos bem definidos entre eles
Portanto, a adoção de um monorepo geralmente permite mais flexibilidade de implantação.
O monorepo
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
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"
]
}
]
}