Skip to content

Instantly share code, notes, and snippets.

@Geovanek
Last active August 10, 2023 12:39
Show Gist options
  • Save Geovanek/b848ff9feb5e2879cf23f9699a0bb0a8 to your computer and use it in GitHub Desktop.
Save Geovanek/b848ff9feb5e2879cf23f9699a0bb0a8 to your computer and use it in GitHub Desktop.
Laravel: Development Environment

Instalação e configuração do Husky para automatização de processos.

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 ""

Configurando Prefixos Nas Mensagens de Commit

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á o index que será utilizado nas mensagens de commit, para isso, as branch de feature, por exemplo, devem sempre ter um prefito identificador no formato COD-1.

Agora basta adicionar ao git do projeto:

git add .husky/commit-msg

Análise Estática, Testes e Fixar Estilo (Pre-Commit)

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-commitdentro 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;

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
    }
}

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment