Executando verificação de segurança...
5
Cosmo
4 min de leitura ·

Usei mais de um repositório no mesmo projeto! - Submódulos com Git 📁

Índice

  1. Por que usei?
  2. Visão geral sobre submódulos
  3. Usando submódulos
  4. 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!!! 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

🎉 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

🎉 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! 🙏

Carregando publicação patrocinada...
2

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?

1
1

Primeiramente, muito obrigado!!!

Bom... eu entendi sua pergunta de duas formas.

Se executar o comando npm install file:<destino>/<pasta>/<submodulo>/, somente as dependências deste submódulo serão instaladas?

Sim. Além disso, será adicionado como uma dependência do seu projeto, lá no package.json, e se você usar o argumento --dev esse submódulo será listado como dependencia de desenvolvimento.

Este meio que complementa o primeiro... Se executar npm install os pacotes dos submódulos listados no package.json do meu projeto serão instalados?

Sim, eles serão instalado.

OBS: Não encontrei uma forma de instalar os pacotes listados como dependências de desenvolvimento dos submódulos. Se você douber, me conta?!

2

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!

1

Obrigado!!!

Acredito que funcione, já que no teu repositório remoto ficará somente a referência do submódulo usado.

Espero teu retorno! 😁

0
1

Neste caso você precisa adicionar a etapa que atualiza o/os submódulo(os) do seu projeto antes de realizar as outras etapas da sua integração.

Execute na raiz do projeto

git submodule update --init --recursive

update --init: atualiza e inicia o submódulo
--recursive: busca e faz o mesmo para submódulos que estão dentro dos submódulos (aninhados)

obs: se você acessar a pasta do submódulo e executar este comando, ele irá atualizar submódulos dentro dele e seus submódulos aninhados.

0
1