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!