Tenho contribuído com o incrível projeto A-Frame, uma biblioteca que permite criar experiências de RV usando tecnologias da Web, e tem sido fantástico. O código JavaScript é muito conciso e uniforme, o que torna a contribuição uma alegria, mantendo os padrões de código rigorosos. Por que ele é tão conciso? O projeto A-Frame usa uma combinação de JSHint, com o qual todos nós estamos familiarizados, mas com outro pacote que eu não conhecia: husky. A Husky constrói precommit e outros ganchos do git para executar comandos em seu package.json antes que um commit seja permitido.


package.json


O senhor acrescentará husky ao campo devDependencies dentro do objeto package.json para obter acesso ao utilitário durante a npm install. Dentro do seu scripts o senhor criará uma chave, precommit por exemplo, para executar o JSHint ou qualquer outra rotina que o senhor desejar. Aqui está um exemplo reduzido:



{
  /* ... */
  "scripts": {
    "lint": "semistandard -v | snazzy",
    "precommit": "npm run lint"
  },
  /* ... */
  "devDependencies": {
    /* ... */
    "husky": "^0.10.1",
    "semistandard": "^7.0.2",
    "snazzy": "^3.0.0"
  }
  /* ... */
}


O Gancho


É gerado um gancho com a seguinte aparência (.git/hooks/pre-commit como exemplo):



#!/bin/sh
# husky
PATH="/usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/YOURUSER/Projects/aframe/node_modules/husky/node_modules/.bin:/Users/YOURUSER/Projects/aframe/node_modules/.bin:/usr/local/bin:/Users/YOURUSER/.rvm/gems/ruby-2.1.1/bin:/Users/YOURUSER/.rvm/gems/ruby-2.1.1@global/bin:/Users/YOURUSER/.rvm/rubies/ruby-2.1.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/YOURUSER/.rvm/bin"
cd .
[ -f package.json ] && cat package.json | grep -q '"precommit"\s*:'
[ $? -ne 0 ] && exit 0
npm run precommit
if [ $? -ne 0 ]; then
  echo
  echo "husky - pre-commit hook failed (add --no-verify to bypass)"
  echo
  exit 1
fi


O gancho verifica se há um package.json e, em seguida, verifica se há um arquivo scripts para o arquivo de gancho em que se encontra; se houver, o scripts key é executado e somente se ele retornar 0 permite que o commit seja concluído; se houver algum erro de lint, por exemplo, o commit não será executado e o senhor terá que corrigir os erros apresentados pelo JSHint.


Usar o husky para o JSHint é apenas um exemplo de uso; o senhor pode usar o husky para executar qualquer comando que desejar, como verificação ortográfica ou de vulnerabilidade de segurança, para garantir que o commit atenda aos seus padrões. Gostaria de ter conhecido o husky há muito tempo: ele torna a configuração de hooks estruturada e fácil!