Como aderir aos padrões de codificação do Drupal com Git Hooks

Publicados: 2023-05-23

Um bom código é como criações de Lego bem construídas - é forte, tem boa aparência e é fácil de mudar se você precisar. A importância de bons padrões de codificação é especialmente alta quando você está codificando em uma equipe, trabalhando em um projeto escalável ou participando de uma comunidade de código aberto como o Drupal.

Como em qualquer outro projeto de código aberto, o Drupal tem milhares de desenvolvedores trabalhando no projeto. E cada um deles vem com seu próprio nível de especialização. Como você garante que todos em sua equipe ou na comunidade sigam boas práticas de codificação? Git Hooks!

Os Git Hooks são uma maneira fácil e automatizada de garantir que seu código sempre atenda aos padrões de codificação do Drupal. A implementação dos padrões de codificação Drupal com o gancho Git ajudará os desenvolvedores a confirmar e enviar o código com os padrões de codificação adequados, conforme declarado pela comunidade Drupal. Ele também pode ajudar a melhorar suas habilidades de gerenciamento de projetos e permite que os desenvolvedores confirmem o código com os padrões adequados de mensagem de confirmação. Saiba mais sobre Git hooks e como colocá-los em ação.

git hooks

O que é um Git Hook

Git Hooks são scripts que serão executados automaticamente toda vez que um comando Git for invocado. Assim como você usaria hook_form_alter para alterar os formulários no Drupal, você pode ter ganchos predefinidos separados para cada ação do Git.

git hook

A representação pictórica do Git hook

Encontrando ganchos do Git

Você pode encontrar ganchos do Git dentro da pasta do seu projeto (desde que o Git esteja inicializado) em .git/hooks . Lá, você encontrará todos os ganchos com extensão .sample para evitar que sejam executados por padrão.

Para usar os ganchos necessários, você precisa remover a extensão .sample e editar seu código para a execução.

Há muitos ganchos do Git disponíveis, mas vamos usar ganchos do Git pré-commit para iniciar os padrões de codificação do Drupal.

Ganchos do Git pré-confirmados são ganchos que serão executados antes que o código seja confirmado. Ele verifica a linha de código que está sendo confirmada.

Implementando Git Hooks

Antes de começar, certifique-se de ter estes requisitos básicos prontos:

  • Compositor
  • git
  • php-code-sniffer
  • drupal/codificador:8.3.13

O procedimento abaixo é para instalá-lo em dispositivos Mac. Você pode encontrar o link de referência aqui para instruções de instalação em outros dispositivos.

  • brew instalar php-code-sniffer
  • composer global requer drupal/coder:8.3.13
  • phpcs --config-setinstalled_paths ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpcs -i → Fornecerá padrões de codificação instalados.

Vamos começar!

Estou criando um novo projeto Drupal chamado demo . Você também pode usá-lo em seu projeto existente.

demonstração do projeto drupal

→ Usando o comando cd, entramos na pasta do projeto.
cd demo

→ inicializando o git no projeto
Git init

→ Adicionando e fazendo meu primeiro commit.
git commit -m “Commit inicial”

Confirmação inicial

→ Instalando o sniffer de código php usando o comando abaixo para Mac.
brew instalar php-code-sniffer

atualizado automaticamente

→ Instalando o codificador Drupal usando o composer
composer global requer drupal/coder:8.3.13

→ Depois que o codificador e seu caminho forem definidos, você obterá a seguinte saída, conforme mostrado na imagem abaixo.
phpcs --config-setinstalled_paths ~/.composer/vendor/drupal/coder/coder_sniffer

→ phpcs -i
O comando acima lhe dará Drupal e DrupalPractice

farejador

→ Agora você pode confirmar seu código. Se você tiver algum erro padrão de sintaxe ou codificação, você será notificado na tela e seu processo de commit será abortado.

código de confirmação

→ Abaixo está o código para corrigir o erro automaticamente

phpcbf --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml web/modules/custom/demo

Qualquer outro problema precisará ser corrigido manualmente. Confirme seu código uma vez feito.

corrigir código de erro

Assim que seu código estiver limpo, ele permitirá que você confirme o código

código de teste

Apenas copie e cole o código em pre-commit.sample dentro de .git/hooks. Não se esqueça de remover as extensões de amostra.

Exemplo de código de pré-confirmação:

 #!/bin/bash # Redirect output to stderr. exec 1>&2 # Color codes for the error message. redclr=`tput setaf 1` greenclr=`tput setaf 2` blueclr=`tput setaf 4` reset=`tput sgr0` # Printing the notification in the display screen. echo "${blueclr}" echo "................................. Validating your codes ……..…………....." echo "-----------------------------------------------------------${reset}" # Mentioning the directories which should be excluded. dir_exclude='\/kint\/|\/contrib\/|\/devel\/|\/libraries\/|\/vendor\/|\.info$|\.png$|\.gif$|\.jpg$|\.ico$|\.patch$|\.htaccess$|\.sh$|\.ttf$|\.woff$|\.eot$|\.svg$' # Checking for the debugging keyword in the commiting code base. keywords=(ddebug_backtrace debug_backtrace dpm print_r var_dump dump console\.log) keywords_for_grep=$(printf "|%s" "${keywords[@]}") keywords_for_grep=${keywords_for_grep:1} # Flags for the counter. synatx_error_found=0 debugging_function_found=0 merge_conflict=0 coding_standard_error=0 # Checking for PHP syntax errors. changed_files=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD -- | egrep '\.theme$|\.module$|\.inc|\.php$'` if [ -n "$changed_files" ] then for FILE in $changed_files; do php -l $FILE > /dev/null 2>&1 compiler_result=$? if [ $compiler_result -eq 255 ] then if [ $synatx_error_found -eq 0 ] then echo "${redclr}" echo "# Compilation error(s):" echo "=========================${reset}" fi synatx_error_found=1 `php -l $FILE > /dev/null` fi done fi # Checking for debugging functions. files_changed=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD -- | egrep -v $dir_exclude` if [ -n "$files_changed" ] then for FILE in $files_changed ; do for keyword in "${keywords[@]}" ; do pattern="^\+(.*)?$keyword(.*)?" resulted_files=`git diff --cached $FILE | egrep -x "$pattern"` if [ ! -z "$resulted_files" ] then if [ $debugging_function_found -eq 0 ] then echo "${redclr}" echo "Validating keywords" echo "================================================${reset}" fi debugging_function_found=1 echo "Debugging function" $keyword git grep -n $keyword $FILE | awk '{split($0,a,":"); printf "\found in " a[1] " in line " a[2] "\n"; }' fi done done fi # Checking for Drupal coding standards changed_files=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD -- | egrep -v $dir_exclude | egrep '\.php$|\.module$|\.inc$|\.install$|\.test$|\.profile$|\.theme$|\.js$|\.css$|\.info$|\.txt$|\.yml$'` if [ -n "$changed_files" ] then phpcs_result=`phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml --report=csv $changed_files` if [ "$phpcs_result" != "File,Line,Column,Type,Message,Source,Severity,Fixable" ] then echo "${redclr}" echo "# Hey Buddy, The hook found some issue(s)." echo "---------------------------------------------------------------------------------------------${reset}" phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml $changed_files echo "<=======> Run below command to fix the issue(s)" echo "# phpcbf --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml your_custom_module_or_file_path" echo “<====================================================>" echo "# To skip the Drupal Coding standard issue(s), Please use this commands << git commit -m your commit Message --no-verify >>" echo "-----------------------------------------------------------------------------------------------------------------------------------------${reset}" coding_standard_error=1 fi fi # Checking for merge conflict markers. files_changed=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD --` if [ -n "$files_changed" ] then for FILE in $files_changed; do pattern="(<<<<|====|>>>>)+.*(\n)?" resulted_files=`egrep -in "$pattern" $FILE` if [ ! -z "$resulted_files" ] then if [ $merge_conflict -eq 0 ] then echo "${redclr}" echo "-----------------------Unable to commit the file(s):------------------------" echo "-----------------------------------${reset}" fi merge_conflict=1 echo $FILE fi done fi # Printing final result errors_found=$((synatx_error_found+debugging_function_found+merge_conflict+coding_standard_error)) if [ $errors_found -eq 0 ] then echo "${greenclr}" echo "Wow! It is clean code" echo "${reset}" else echo "${redclr}" echo "Please Correct the errors mentioned above. We are aborting your commit." echo "${reset}" exit 1 fi

Pensamentos finais

Espero que você tenha achado este artigo interessante e que ele o ajude a escrever um código melhor porque um código melhor significa uma web melhor! Gostou do que acabou de ler? Considere assinar nosso boletim informativo semanal e receba informações técnicas como esta em sua caixa de entrada!