Acceder al contenido principal

Grumphp, mejora la calidad del código (y ejemplos para Drupal)

Volver a Blog

Grumphp, mejora la calidad del código (y ejemplos para Drupal)

03 Dic 021
grumphp
avatar

Drupal , Grumphp ,

TL;DR: Grumphp te fuerza a escribir bien el código impidiéndote hacer commit si no lo haces bien. En este artículo se muestra su uso y algunos ejemplos para Drupal.

Qué es Grumphp y para qué se usa

Grumphp es una herramienta de php que automatiza las comprobaciones de código para comprobar que se están usando buenas prácticas, que no hay líneas duplicadas, que los archivos de composer están correcto, que los tests pasan... Pueden verse todos los plugins (hay bastantes) y sus configuraciones aquí.

Para hacer estas comprobaciones automáticas, hace uso de un hook pre-commit de git, que analiza solamente los archivos que van a ir en el commit.

Ejemplo de error al ir a hacer un commit:

> git -c user.useConfigOnly=true commit --quiet --allow-empty-message --file -
GrumPHP detected a pre-commit command.
GrumPHP is sniffing your code!

Running tasks with priority 0!
==============================

Running task 1/1: phpcs... 

Running task 1/1: phpcs... ✘

             ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
           ▄▄▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌
         ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
        ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌
       ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌
  ▄███▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌
 █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌
 ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌
   ▀█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌
     ▀▀▓▓▓▓▓▓▓▓▓▓▓▓█▀▀▀▀▀▀▀▀▀▀▀▀▀▀████████████▄
      ▄███████                       ██████████
     ███████▀  ▀▀▀▀▀▄      ▄▀▀▀▀▀     █████ ▀
      ▐████      ▐██        ▐██        ████▌
      ████▌                            ███
       ▌██▌           ▄▄ ▄▄           ▐███
        ███       ▄▄▄▄▄▄▄▄▄▄▄▄       ▐███
         ██▄ ▐███████████████████████████
        █▀███████████▀     ▀▀███████████
          ██████████▄███████▄███████████
         ▐█████████████████████████████
          █████████████████████████████
           ██ █████████████████████▐██▀
            ▀ ▐███████████████████▌ ▐▀
                ████▀████████▀▐███
                 ▀█▌  ▐█████  ██▌
                        ██▀   ▐▀

       ██████████████████████████████████
       █░░░░░░▀█▀░░░░░░▀█░░░░░░▀█▀░░░░░▀█
       █░░▐█▌░░█░░░██░░░█░░██░░░█░░░██░░█
       █░░▐█▌░░█░░░██░░░█░░██░░░█░░░██░░█
       █░░▐█▌░░█░░░██░░░█░░░░░░▄█░░▄▄▄▄▄█
       █░░▐█▌░░█░░░██░░░█░░░░████░░░░░░░█
       █░░░█░░░█▄░░░░░░▄█░░░░████▄░░░░░▄█
       ██████████████████████████████████


phpcs
=====

FILE: /home/projects/drupal/test.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 1 | ERROR | [x] Missing file doc comment
----------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------

Time: 50ms; Memory: 8MB

You can fix errors by running the following command:
'/home/projects/drupal/vendor/bin/phpcbf' '--standard=vendor/drupal/coder/coder_sniffer/Drupal/,vendor/drupal/coder/coder_sniffer/DrupalPractice/' '--extensions=php,inc,module,install,profile,theme' '--encoding=utf-8' '--report=full' '/home/projects/drupal/test.php'
To skip commit checks, add -n or --no-verify flag to commit command

 I can fix some stuff automatically, do you want me to? (yes/no) [no]:
 > 

 

Instalar grumphp en un proyecto

Es recomendable instalarlo como dependencia de desarrollo:

composer require --dev phpro/grumphp

Una vez instalado, automáticamente pregunta si se quiere que se cree un archivo de configuración. En caso de que se quiera, permite elegir las tareas que se quieren poner (pueden editarse y añadirse más más tarde en el archivo grumphp.yml generado en la raíz del proyecto). Acto seguido, crea el hook pre-commit de git para ejecutarse cuando se vaya a hacer un commit.

Si se usa DDEV, docker o similar, se le puede indicar a grumphp que use el binario de php del contenedor. Ejemplo para DDEV:

grumphp:
  hooks_dir: ~
  git_hook_variables:
    EXEC_GRUMPHP_COMMAND: ddev exec php

Una vez cambiado esto es necesario refrescar el hook de git para que coja los cambios:

./vendor/bin/grumphp git:deinit
./vendor/bin/grumphp git:init

Evitar las comprobaciones automáticas

En caso de que se quiera evitar que grumphp se ejecute para el commit que se quiere crear actualmente, basta con añadir "-n" o "--no-verifiy" al commit. Ejemplo:

git commit -m "Random commit mesage" -n

Si se quiere deshabilitar por completo, puede eliminarse el hook de git con:

./vendor/bin/grumphp git:deinit

Ejemplos de tareas a ejecutar en Drupal

PHP Codesniffer

CodeSniffer detecta código que no siga un estándar (PSR-2, etc). Más información.

Puede instalarse junto a los estándares de código de Drupal con:

composer require --dev drupal/coder

Y configurarse en el archivo grump.yml:

grumphp:
  hooks_dir: ~
  tasks:
    phpcs:
      encoding: utf-8
      triggered_by:
        - php
        - inc
        - module
        - install
        - profile
        - theme
      standard: vendor/drupal/coder/coder_sniffer/Drupal/,vendor/drupal/coder/coder_sniffer/DrupalPractice/

Nota: En caso de error, si el commit se está intentando hacer desde consola, dará la opción de autoarreglar algunos fallos.

Pueden verse más opciones de configuración aquí.

PHPStan

PHPStan es un analizador de código estático. Más información.

Puede instalarse con soporte de código de Drupal gracias al genial adaptador phpstan-drupal de mglaman con:

composer require --dev phpstan/phpstan phpstan/extension-installer mglaman/phpstan-drupal phpstan/phpstan-deprecation-rules

En caso de que se quiera configurar phpstan más a fondo, puede crearse un archivo "phpstan.neon" en la raíz del proyecto, pero para configuraciones simples basta con la configuración de la tarea en el archivo grumphp.yml:

grumphp:
  hooks_dir: ~
  tasks:
    phpstan:
      level: 5
      triggered_by:
        - php
        - inc
        - module
        - install
        - profile
        - theme
      memory_limit: "-1"
      use_grumphp_paths: true

Pueden verse más opciones de configuración aquí.

Comentarios

Añadir nuevo comentario