Como usar os ganchos do Git para detectar alterações em um arquivo de bloqueio e mostrar uma mensagem
Quando estamos trabalhando em uma equipe colaborativa, de tempos em tempos um desenvolvedor precisa adicionar um novo pacote a um branch que é então mesclado ao master. Alguém pode não saber disso e apenas puxar o master e executar o aplicativo apenas para que ele falhe devido ao pacote ausente. Vamos ver como podemos usar os ganchos do Git para detectar alterações em a package.json
ou a yarn.lock
e exibir uma mensagem solicitando que o usuário instale as dependências ausentes.
O que são ganchos do Git?
Os ganchos do Git são acionados quando ocorre algum evento do Git, como um novo commit, push de commits para um branch online, pull commits, check-out de um branch ou merge de um branch. Esses processos terminam com 0 quando terminam corretamente ou algum outro valor quando terminam incorretamente.
Se o processo hooked terminar com 0, a ação do Git continua. Caso contrário, a ação do Git é bloqueada. Por exemplo, se você configurar um gancho Git pré-commit para fazer o lint do seu código, o Git executará isso quando você fizer um arquivo git commit
. Se o lint falhar, o commit não será concluído.
Os hooks do Git são algo integrado ao Git e a lista de hooks é bem extensa. Por exemplo, você tem pre-push, post-commit, post-checkout, post-merge e muitos outros ganchos do Git.
Execute os ganchos do Git com o Husky
Para executar algumas tarefas quando os hooks do Git são acionados, podemos usar o pacote Husky para Node.js. O Husky nos permite especificar em um package.json
arquivo quais scripts devem ser executados quando um gancho do Git é acionado. Instale o pacote Husky com NPM:
npm i -D husky
ou Fio:
yarn add -D husky
Agora você precisa inicializar os ganchos do Husky para Git. Se você usa NPM:
npx husky install
e se você usar o fio
yarn husky install
e pronto, agora você instalou e configurou o Husky para executar hooks do Git. Finalmente é hora de definir um gancho!
Adicione um gancho Git post merge para verificar as alterações do arquivo de bloqueio
Queremos executar algum código para nos alertar se os arquivos package-lock.json
ou yarn.lock
foram alterados. Isso geralmente acontece quando puxamos master
e esses arquivos foram alterados. Podemos configurar um gancho para ser executado quando mesclarmos uma ramificação.
Para especificar nossos ganchos do Git para o Husky, nós os definimos no package.json
arquivo. Adicione isto como uma chave de nível superior:
"husky": {
"hooks": {
"post-merge": "./githooks/post-merge-hook.sh"
}
}
O que isso diz é que depois que uma ramificação for mesclada, executaremos esse script. Agora temos que criá-lo. Crie uma pasta, adicione um arquivo a ela e configure-a para ser executável:
mkdir githooks && cd githooks && touch post-merge-hook.sh && chmod +x post-merge-hook.sh
Se você não configurá-lo para ser executável, você encontrará um erro "Permissão negada" quando o Husky tentar executar este gancho do Git. Agora edite o arquivo com o Vim ou seu editor favorito e cole isso nele:
changedFiles="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
runOnChange() {
echo "$changedFiles" | grep -q "$1" && echo -e "$2"
}
runOnChange package-lock.json "033[35m*******************************************************************************n* 033[33mpackage-lock.json033[35m has changed. Run033[33m npm install033[35m to update your dependencies. *n*******************************************************************************"
exit 0
Isso imprimirá uma mensagem em roxo com as palavras package-lock.json
e npm install
em laranja. Este script verifica se package-lock.json
foi atualizado e, se você quiser testar yarn.lock
, basta substituir o nome do arquivo.
Testar a verificação de alteração do arquivo de bloqueio
Testar isso não é muito complexo. Basicamente, você só precisa criar uma nova ramificação, instalar algum pacote para que package-lock.json
seja modificado, confirmá-lo e mudar para a ramificação anterior. Tudo o que pode ser feito com este comando:
git checkout -b testbranch && npm i -D lint-staged && git add. && git commit -m "test" && git checkout -
Agora você precisa mesclá-lo neste branch
git merge testbranch
Isso acionará o gancho post-merge e executará nosso script. Você verá esta mensagem na linha de comando porque package-lock.json
foi modificado durante a mesclagem:
Detectando uma alteração no arquivo de bloqueio no VS Code
Este foi apenas um uso. Os ganchos do Git podem ser usados de várias maneiras, por exemplo, para executar o pacote popular Prettier antes de você confirmar algo para formatar seu código.
Existem alternativas para este caso específico, de verificar se package-lock.json
foi atualizado. Por exemplo, para o VS Code, há um pacote bacana Atualizar pacotes NPM que solicitará que você atualize seus pacotes se detectar uma modificação. Ele será executado independentemente de você ter configurado hooks do Git ou não. Outra coisa legal é que funcionará quando você trocar de branches, mesmo sem mesclar um deles no outro.
No entanto, a vantagem do que implementamos aqui é que ele será executado na linha de comando e não depende de um editor de código específico. Se você estiver trabalhando, por exemplo, em um projeto de código aberto, convém configurar o que está descrito aqui para que haja um terreno comum para todos os desenvolvedores envolvidos, independentemente de sua configuração.