npm install husky --save-dev
npx husky install
npm pkg set scripts.prepare="husky install"
Adicionar no package.json
as seguintes linhas.
{
"scripts": {
"prepare": "husky install",
"postinstall": "husky install"
}
}
dessa forma, toda vez que o projeto for instalado, Husky será automaticamente instalado e, também, sempre que for rodado um npm install
ou npm update
o Husky será rodada novamente.
Na sequência, criar o arquivo:
npx husky add .husky/commit-msg ""
para configurar um prefixo padrão as mensagens de commit para identificação de qual feature, por exemplo, aquele commit foi realizado.
Para isso, adicionar no arquivo commit-msg
criado o seguinte código:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# Cores
NC='\033[0m'
BBlue='\033[1;34m'
BRed='\033[1;31m'
REGEX_ISSUE_ID="[a-zA-Z0-9,\.\_\-]+-[0-9]+"
BRANCH_NAME=$(git symbolic-ref --short HEAD)
ISSUE_ID=$(echo "$BRANCH_NAME" | grep -o -E "$REGEX_ISSUE_ID") || true
COMMIT_MESSAGE=$(cat "$1")
if [ -z "$ISSUE_ID" ]; then
echo "${BRed}Branch não está no padrão que deveria mestre... ${NC}"
exit 1
fi
# i.g. HEY-1: HEY-1: my feature
if [[ $COMMIT_MESSAGE == $ISSUE_ID* ]]; then
exit 0
fi
echo "$ISSUE_ID: $COMMIT_MESSAGE" >$1
Esse comando pega o nome da
branch
e identifica através do REGEX qual será oindex
que será utilizado nas mensagens de commit, para isso, asbranch
defeature
, por exemplo, devem sempre ter um prefito identificador no formato COD-1.
Agora basta adicionar ao git
do projeto:
git add .husky/commit-msg
Antes de o commit ser realizado, iremos aplicar a verificação do PHPStan para análise estática dos códigos, também será rodado os testes automatizados (Pest) e aplicado a correção de estilo nos codigos (Laravel Pint).
Para isso, criar o arquivo pre-commit
dentro da pasta do Husky e adicionar o seguinte código:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
if [ -f "./vendor/bin/phpstan" ]; then
# Rodar o phpstan
./vendor/bin/phpstan
if [ $? -ne 0 ]; then
echo "Opa! Deu ruim aqui com PHPSTAN. Arrume antes de continuar... 😉";
exit 1;
fi;
else
echo "Larastan is not installed."
exit 1;
fi
if [ -f "./vendor/bin/pint" ]; then
# Formatar cada arquivo alterado usando o Laravel Pint
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".php\{0,1\}$") || true
for FILE in $STAGED_FILES;
do
./vendor/bin/pint "${FILE}"; #> /dev/null >&1;
git add "${FILE}";
done
else
echo "Laravel Pint is not installed."
exit 1;
fi
if [ -f "./vendor/bin/pest" ]; then
# rodar os testes
php artisan test --parallel | php
if [ $? -ne 0 ]; then
echo "Opa! Algum teste deu ruim. Arruma essa bagaça antes... 😉";
exit 1;
fi;
else
echo "Pest is not installed."
exit 1;
fi
exit 0;
Laravel Pint [https://laravel.com/docs/10.x/pint]
O Laravel Pint é um fixador de estilo de código PHP opinativo para minimalistas. O Pint é construído sobre o PHP-CS-Fixer e torna simples garantir que seu estilo de código permaneça limpo e consistente.
Instalação:
composer require laravel/pint --dev
Para personalizar as predefinições, regras ou pastas inspecionadas, basta criar um arquivo pint.json
no diretório raiz do seu projeto.
Abaixo a lista das configurações que utilizo:
{
"preset": "psr12",
"rules": {
"align_multiline_comment": true,
"array_indentation": true,
"array_syntax": {
"syntax": "short"
},
"binary_operator_spaces": {
"default": "single_space",
"operators": {
"=>": "align_single_space_minimal"
}
},
"blank_line_after_namespace": true,
"blank_line_after_opening_tag": false,
"blank_line_before_statement": {
"statements": [
"break",
"continue",
"declare",
"return",
"throw",
"try",
"continue",
"do",
"exit",
"for",
"foreach",
"if",
"include",
"include_once",
"require",
"require_once"
]
},
"class_attributes_separation": {
"elements": {
"property": "one"
}
},
"combine_consecutive_issets": true,
"combine_consecutive_unsets": true,
"concat_space": {
"spacing": "one"
},
"declare_equal_normalize": {
"space": "single"
},
"declare_parentheses": true,
"declare_strict_types": true,
"elseif": false,
"encoding": true,
"explicit_string_variable": true,
"final_class": true,
"final_internal_class": false,
"fully_qualified_strict_types": true,
"global_namespace_import": {
"import_classes": true,
"import_constants": true,
"import_functions": true
},
"group_import": false,
"indentation_type": true,
"is_null": true,
"lambda_not_used_import": true,
"logical_operators": true,
"mb_str_functions": true,
"method_chaining_indentation": true,
"modernize_strpos": true,
"new_with_braces": true,
"no_extra_blank_lines": true,
"no_empty_comment": true,
"no_multiline_whitespace_around_double_arrow": true,
"no_singleline_whitespace_before_semicolons": true,
"no_spaces_around_offset": true,
"no_unused_imports": true,
"no_useless_else": false,
"no_useless_return": true,
"not_operator_with_space": true,
"ordered_imports": true,
"ordered_traits": true,
"simplified_if_return": true,
"standardize_increment":true,
"single_import_per_statement": false,
"strict_comparison": true,
"ternary_operator_spaces": true,
"ternary_to_null_coalescing": true,
"trailing_comma_in_multiline": true,
"trim_array_spaces": true,
"unary_operator_spaces": true,
"use_arrow_functions": true,
"void_return": true,
"whitespace_after_comma_in_array": true,
"yoda_style": true
}
}
Larastan [https://github.com/nunomaduro/larastan]
Realizar a instação via (lembrar de verficiar versão):
composer require nunomaduro/larastan:^2.0 --dev
Criar um arquivo phpstan.neon na raíz do projeto e realizar a configuração do PHPStan. Meu arquivo:
includes:
- ./vendor/nunomaduro/larastan/extension.neon
#- ./phpstan-baseline.neon
parameters:
paths:
- app/
checkInternalClassCaseSensitivity: true
# checkModelProperties: true
# Level 9 is the highest level
level: 2
Uma forma de ignorar erros antigos que não foram solucionados, ou que foram deixados em segundo plano, é criar um arquivo de "log" para listar esses erros antigos, mas não serem processados novamente em análises futuras, para isso, ao rodar PHPStan utilizar junto o comando:
./vendor/bin/phpstan analyse --generate-baseline
Utilizando o Sail, é necessário sempre digitar junot
sail php ./vendor/bin/phpstan
.