Cómo adherirse a los estándares de codificación de Drupal con Git Hooks

Publicado: 2023-05-23

Un buen código es como las creaciones de Lego bien construidas: es fuerte, se ve bien y es fácil de cambiar si es necesario. La importancia de buenos estándares de codificación es especialmente alta cuando se codifica en equipo, se trabaja en un proyecto escalable o se participa en una comunidad de código abierto como Drupal.

Al igual que con cualquier otro proyecto de código abierto, Drupal tiene miles de desarrolladores trabajando en el proyecto. Y cada uno de ellos viene con su propio nivel de experiencia. ¿Cómo se asegura de que todos en su equipo o en la comunidad sigan buenas prácticas de codificación? ¡Ganchos!

Los Git Hooks son una forma sencilla y automatizada de garantizar que su código siempre cumpla con los estándares de codificación de Drupal. La implementación de los estándares de codificación de Drupal con Git hook ayudará a los desarrolladores a confirmar y enviar el código con los estándares de codificación adecuados, según lo declarado por la comunidad de Drupal. También puede ayudar a mejorar sus habilidades de gestión de proyectos y permite a los desarrolladores confirmar el código con los estándares de mensajes de confirmación adecuados. Obtenga más información sobre los ganchos de Git y cómo ponerlos en acción.

ganchos de git

¿Qué es un Git Hook?

Los Git Hooks son scripts que se ejecutarán automáticamente cada vez que se invoque un comando de Git. Así como usaría hook_form_alter para modificar los formularios en Drupal, puede tener ganchos predefinidos separados para cada acción de Git.

anzuelo

La representación pictórica de Git hook

Encontrar ganchos de Git

Puede encontrar ganchos de Git dentro de la carpeta de su proyecto (siempre que Git esté inicializado) en .git/hooks . Allí encontrarás todos los hooks con extensión .sample para evitar que se ejecuten por defecto.

Para hacer uso de los ganchos requeridos, debe eliminar la extensión .sample y editar su código para la ejecución.

Hay muchos ganchos de Git disponibles, pero vamos a usar ganchos de Git de confirmación previa para iniciar los estándares de codificación de Drupal.

Los ganchos Git de confirmación previa son ganchos que se ejecutarán antes de que se confirme el código. Comprueba la línea de código que se está confirmando.

Implementación de ganchos de Git

Antes de comenzar, asegúrese de tener listos estos requisitos básicos:

  • Compositor
  • Git
  • Php-code-sniffer
  • drupal/codificador:8.3.13

El siguiente procedimiento es para instalarlo en dispositivos Mac. Puede encontrar el enlace de referencia aquí para obtener instrucciones de instalación en otros dispositivos.

  • brew install php-code-sniffer
  • compositor global requiere drupal/codificador: 8.3.13
  • phpcs --config-set rutas_instaladas ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpcs -i → Le dará estándares de codificación instalados.

¡Vamos a empezar!

Estoy creando un nuevo proyecto de Drupal llamado demo . También puede usarlo en su proyecto existente.

demostración del proyecto drupal

→ Usando el comando cd entramos en la carpeta del proyecto.
CD de demostración

→ inicializando git en el proyecto
Git inicializar

→ Agregando y haciendo mi primer commit.
git commit -m "Commit inicial"

Compromiso inicial

→ Instalar el rastreador de código php usando el siguiente comando para Mac.
brew install php-code-sniffer

actualizado automáticamente

→ Instalar el codificador Drupal usando Composer
compositor global requiere drupal/codificador: 8.3.13

→ Una vez que se defina el codificador y su ruta, obtendrá el siguiente resultado como se muestra a continuación en la imagen.
phpcs --config-set rutas_instaladas ~/.composer/vendor/drupal/coder/coder_sniffer

→ phpcs-i
El comando anterior le dará Drupal y DrupalPractice

oledor

→ Ahora puedes enviar tu código. Si tiene algún error estándar de codificación o sintaxis, se le notificará en la pantalla y se cancelará su proceso de confirmación.

código de confirmación

→ A continuación se muestra el código para corregir el error automáticamente

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

Cualquier otro problema deberá solucionarse manualmente. Confirme su código una vez hecho.

corregir el código de error

Una vez que su código esté limpio, le permitirá confirmar el código

código de prueba

Simplemente copie y pegue el código en pre-commit.sample dentro de .git/hooks. No olvide eliminar las extensiones de muestra.

Ejemplo de código de confirmación previa:

 #!/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

Pensamientos finales

Espero que este artículo te haya resultado interesante y que te ayude a escribir mejor código porque ¡mejor código significa una mejor web! ¿Te gustó lo que acabas de leer? ¡Considere suscribirse a nuestro boletín semanal y obtenga información tecnológica como esta en su bandeja de entrada!