Desenvolvimento

23 ago, 2016

Prevenindo commits ruins com Husky

Publicidade

Eu tenho contribuído com o incrível projeto A-Frame, uma biblioteca que permite criar experiências de realidade virtual utilizando tecnologias web, e tem sido fantástico. O código JavaScript é muito conciso e uniforme, fazendo da contribuição uma alegria enquanto mantém os padrões estritos de código. Por que é tão conciso? O projeto A-Frame utiliza uma combinação de JSHint, com o qual estou familiarizado, mas um outro pacote com o qual eu não estava familiarizado foi husky. Husky constrói precommit e outros hooks git para executar comandos dentro do seu package.json antes da permissão de um commit.

package.json

Você adicionará husky aos objetos devDependencies dentro package.json para obter acesso ao utilitário durante npm install. Dentro de seus objetos scripts, você vai criar uma chave, precommit por exemplo, para executar JSHint ou quaisquer outras rotinas que você deseja. Aqui está uma amostra reduzida:

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

O hook

Um hook que tem a seguinte aparência é gerado (.git/hooks/pre-commit como um 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 hook faz a verificação para um arquivo package.json, em seguida, verifica se há no scripts uma chave para o arquivo de hook; se assim for, a chave de comando para scripts é executada e somente se o retorno for 0 permite a conclusão do commit; se houver qualquer erro de flint, por exemplo, o commit não é executado e você tem que corrigir os nits apresentados por JSHint.

Usar husky para JSHint é apenas um exemplo de uso; você pode usar husky para executar qualquer comando que você queira, como verificação ortográfica ou checagem de vulnerabilidades de segurança, para garantir que o commit atenda ao seu padrão. Eu gostaria de ter conhecido o husky há muito tempo – ele faz o ajuste de hooks estruturados e é fácil!

***

David Walsh faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://davidwalsh.name/prevent-bad-commits-husky