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!