TLDR: Este texto fala sobre projetos que utilizam npm, informações sobre instalar o pacote husky e criação de hooks para agilizar fluxos de trabalho para atividades repetitivas.
Nessa semana apareceram vários textos bacanas sobre ambições no ambiente de trabalho e na vida além de como nossos softwares continuam lentos e ninguém parece se importar. Então, nessa mesma vibe, por que não parar de perder tempo com aquelas tasks que são necessárias e ainda manuais?
O que são git hooks?
O git tem uma API de disparos quando determinados eventos acontecem. Então, antes de confirmar um commit teríamos o pre-commit
; após um commit, o post-commit
; após um pull ou um merge, o post-merge
. Os disparos acontecem independente das tecnologias do projeto, mas para projetos que usem NPM, temos o Husky ou o ghooks.
E o Husky, o que é?
O husky é um pacote NPM que expõe uma API para utilizar os hooks do git utilizando o package.json e assim, pode ser versionado. Husky não é o único projeto que faz isso, existe o ghooks também. Você pode confirmar todos os hooks disponíveis aqui.
Mas e por que não utilizar git hooks direto?
As configurações dos git hooks ficam dentro do diretório .git/ do projeto. Esse diretório não é versionado, impedindo que os hooks sejam compartilhados por todo o time.
Instalando o husky
Husky é instalado igual qualquer outro pacote npm. Lembrando que os githooks são para facilitar nosso workflow, então não faz sentido ele ser instalado como uma dependência de production -P
, mas sim só de desenvolvimento com -D
.
$ npm install -D husky@next
Adicionando seu primeiro hook
Se você instalou o husky como eu sugeri, você deve ter instalado versão 1.0.0+. É possível confirmar isso no seu package.json
dentro de devDependencies
.
"devDependencies": {
"husky": "^1.0.0"
},
Agora para adicionar um hook basta adicionar um json ao final do `package.json` do seguinte formato:
"husky": {
"hooks": {
"post-merge": $_SCRIPT
}
}
A declaração post-merge
é apenas uma de várias. O post-merge
em particular é um hook associado a merge como o próprio merge e o pull (que é um merge por si só).
$_SCRIPT
é qualquer script que você queira chamar que pode ser tanto um script em bash quanto um script em npm com npm run something
. Eu não vou entrar em detalhes nisso porque é particular de cada processo e projeto.
Observação: em versões anteriores do husky, essa configuração era diferente e foi depreciado, você precisava adicionar os hooks na seção script
do seu package.json
, e ao invés de post-merge
, precisávamos usar postmerge
, no seguinte formato:
"version": "1.0.0",
"scripts": {
"tslint": "tslint -c tslint.json -p .",
"postmerge: "$_SCRIPT"
},
Simples, não é? Aqui na Cubos, utilizamos git hooks para rodar nosso gerador de APIs, linters como tslint ou eslint a depender do projeto, ou até mesmo montar toda a pipeline em ambiente local.
Ahh! Estamos contratando ;)