[Dúvida] Qual a melhor estratégia para reutilizar código em diferentes projetos?
Se você já criou mais de um projeto parecido na mesma stack e teve que reutilizar o mesmo código, então provavelmente já pensou em alguma solução para isso. Caso nunca tenha passado por isso, seria algo semelhante ao diagrama abaixo:
graph TD
subgraph Código Compartilhado
A[Modulo1]
B[Modulo2]
end
Projeto1 -->|Usa| A
Projeto2 -->|Usa| B
C[Projeto3]
C -->|Usa| A
C -->|Usa| B
Quais soluções existem?
Após algumas pesquisas, encontrei 6 soluções mais praticadas em empresas e times, sendo estas:
- Pacotes e bibliotecas
- Git Submodules
- Git Subtrees
- Monorepo*
- APIs e Microsserviços*
- Copiar e colar 🙂
Como quase tudo na tecnologia, aqui não seria diferente ao termos tradeoffs em cada solução apresentada.
-
Pacotes e bibliotecas: são uma solução elegante e eficaz, porém exigem maior complexidade e organização, principalmente em novas versões para não resultar em breaking changes.
-
Git Submodules: funcionam muito bem ao dividir o código em submódulos referenciados pelo hash do commit, isso permite inclusive utilizar diversas versões do código compartilhado sem interferir em projetos já existentes ou legados, a contrapartida vem na complexidade de gerenciar os apontamentos certos para cada submódulo, caso tenha mais de um.
-
Git Subtrees: são muito semelhantes aos Git Submodules, porém ao invés de ser um link com outro repositório, subtrees permitem mesclar um repositório a outro em um subdiretório, que por ser
file-based system
facilita o entendimento no início e ainda mantém o histórico de alterações no repositório pai, em contrapartida aumenta consideravelmente o tamanho do repositório. -
Monorepo: compartilha todo o código em um único repositório, sendo em teoria mais fácil de manusear, porém na ideia de projetos separados ele acaba não entrando.
-
APIs e Microsserviços: são ótimos quando o que precisa ser utilizado são recursos de outro sistema como usuários, pedidos ou algo do tipo, assim como monorepos, não entram na ideia de compartilhar código.
-
Copiar colar: em disparado o mais utilizado 🤣, nenhuma complexidade de gestão, porém deselegante. Fora a brincadeira, as vezes não há necessidade de algo mais complexo, simples assim.
Na empresa onde trabalhei utilizei majoritariamente Git Submodules, porém na ideia de “super” módulo, segue o diagrama abaixo que ilustra a utilização:
graph TD
A["ProjetoSuper"]
B["Core (Submódulo)"]
C["Projeto (Submódulo)"]
subgraph Core
E["Biblioteca Compartilhada"]
end
subgraph Projeto
F["Código Específico do Projeto"]
end
A --> B
A --> C
B -->|Apontamento| E
C -->|Apontamento| F
Gostaria de ouvir de vocês, caros TabNewers, qual estratégia você utiliza em seus projetos pessoais? Quais você utiliza na empresa? Quais experiências você teve?