Usei mais de um repositório no mesmo projeto! - Submódulos com Git 📁
Índice
- Por que usei?
- Visão geral sobre submódulos
- Usando submódulos
- Considerações
Por que usei?
Alguns dias atrás precisei usar este recurso para não ter que copiar e colar todos os arquivos de um repositório para uma API que estou fazendo.
Os arquivos que precisei são modelos de e-mail que, no desenvolvimento, uso um recurso para ter a pré-visualização sem ter que enviar ou gerar o HTML dos modelos. Uso o pacote react-email para isso.
Como o projeto em que precisei é uma API, não queria criar uma rota ou ter que enviar o e-mail apenas para ver como estava, então essa foi a melhor opção que achei, usar o repositório de modelos como um submódulo do projeto.
Visão geral sobre submódulos
Bom, a primeira coisa que você deve ter em mente é que o submódulo é um repositório totalmente independente, isso quer dizer que ele tem suas branches, commits, participantes e etc... Tudo exclusivo. Outra coisa, se você pensa em usar um repositório privado como submódulo você pode, mas terá que ter permissão e não será muito útil se quiser user em um projeto público.
Usando submódulos
Estou usando: Git v2.40.1 Node 18.17.1 LTS
Este é o repositório que usarei como submódulo mais tarde neste exemplo. Ele exporta uma função que recebe um texto e uma letra, essa função retorna true
caso a letra informada seja a última do texto e false
caso não seja. Ele também usa um pacote chamado lodash
, este adicionei apenas para ter um exemplo de instalação dos pacotes do submódulo.
Github: https://github.com/viniciuscosmome/submodule-lib.git
// ⚠ O método original não tem tipagem é JavaScript puro
// Exemplo da tipagem da função
type comparaUltimaLetra = (texto: string, letra: string) => boolean;
Nesta etapa vou assumir que você já tenha um repositório e agora deseja adicionar outro como um submódulo para usar seus métodos.
O meu repositório só contém um arquivo index.js
, que está vazio. Essa é minha estrutura de arquivos:
node_modules
src/
index.js
.gitignore
package.json
[...]
Agora vamos adicionar o repositório de teste como um submódulo. Para isso execute o comando:
# git submodule add <REPO_URL> <DESTINO>
git submodule add https://github.com/viniciuscosmome/submodule-lib.git src/modules/my-lib
REPO_URL: é a url do repositório que deseja adicionar DESTINO: é a pasta onde você deseja adicionar
Após executar o comando uma pasta chamada my-lib
será criada e, como a sua pasta pai modules
não existe, ela também será criada. Dentro da pasta my-lib
estarão todos os arquivos e pastas do repositório adicionado.
Um arquivo chamado .gitmodules
também foi criado, este na raiz do repositório local. Ele contém um mapa para todos os submódulos que existem no seu repositório.
Agora a estrutura de pastas está assim:
node_modules
src/
+ modules/
+ my-lib/
+ lib/
+ index.js
+ test/
+ index.test.js
+ .gitignore
+ [...]
index.js
.gitignore
+.gitmodules
package.json
[...]
No arquivo src/index.js
, que faz parte do meu repositório principal, vou importar a função que a lib exporta e tentar usá-la.
// src/index.js
const compara = require('./modules/my-lib/lib');
const resultado = compara('texto', 'o');
console.log(resultado);
Executando o arquivo:
node src/index.js
:boom: BOOM!!! Um erro me dizendo que o pacote lodash
não pode ser encontrado estoura no terminal. E sim, isso era esperado já que não instalamos as dependências do nosso submódulo recém adicionado.
Para instalar suas dependências, vamos executar o seguinte comando:
npm install file:src/modules/my-lib
Este comando irá instalar as dependências e adicionar sua referência no arquivo package.json
, lá na propriedade "dependencies". Será algo assim:
{
"dependencies": {
"submodule-lib": "file:src/modules/my-lib"
}
}
Bom, agora que as dependências foram instaladas, vamos executar novamente o projeto:
node src/index.js
:tada: SHOW!!! Agora uma mensagem true
ou false
, dependendo dos parâmetros passados, deve ser exibida no seu terminal.
vamos acessar o submódulo e rodar seus testes?
# entrando na pasta
cd src/modules/my-lib
# executando os testes
npm test
:tada: BOA!!! Uma mensagem semelhante a essa deve aparecer:
---Iniciando testes---
✔ Deve retornar true
✔ Deve retornar false
✔ Informa uma posição e deve retornar true
✔ Informa uma posição e deve retornar false
---Finalizando testes---
Considerações
Este foi um exemplo extremamente básico mas suficiente para entender o que é e como usar uma submódulo, sua aplicação pode ter N submódulos... Vou deixar aqui um link do Git que tem tudo sobre submódulos.
Me diga, gostou do post? No que posso melhorar? Agradeço desde já a sua atenção, obrigado! :pray:
Muito interessante o post! Eu utilizo os Submodules onde trabalho para compartilhar componentes e api entre projetos parecidos. Eu estava procurando algo que sincronizasse os pacotes usados só na lib e instalasse eles automaticamente sempre que algo fosse adicionado, essa jogada que você fez com o package.json resolve isso?
Muito bom o post, estou tentando entender como usar submodulos no git, com a ideia de aplicar ele nos meus dotfiles, dessa forma, teria um repo privado com tudo que for sensivel e apenas linkado com a parte publica das minhas configurações, seu post apesar de não abordar isso, foi bem claro e pode me ajudar muito, volto pra dizer se deu bom!
É tranquilo para implementar CI/CD nesse método?
Não esperava vc por aqui skksks, ótimo post