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 ;)