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