Published on

Configuración de un hook de Git con phpstan y php-cs-fixer

Authors

En el desarrollo de software, mantener un código limpio y coherente es esencial para la legibilidad, mantenibilidad y colaboración efectiva en un proyecto

En el desarrollo de proyectos de software, mantener un código limpio y de calidad es fundamental para garantizar su mantenibilidad a largo plazo. En este sentido, existen herramientas que nos ayudan a mejorar la calidad de nuestro código, como phpstan y php-cs-fixer. En esta entrada, aprenderemos cómo configurar un hook de Git para que estas herramientas se ejecuten automáticamente antes de cada confirmación de cambios, asegurando así un código limpio y sin errores.


PHPStan

De PHPStan ya hablamos en una entrada anterior pero hagamos un pequeño resumen. Es una herramienta de análisis estático para PHP que nos permite detectar posibles errores, problemas de rendimiento y mejoras en nuestro código sin necesidad de ejecutarlo. Con su análisis exhaustivo, phpstan nos brinda una mayor confianza en la calidad de nuestro código.


PHP-CS-Fixer

PHP-CS-Fixer es una herramienta de línea de comandos desarrollada por el equipo de Symfony. Su objetivo principal es corregir automáticamente el estilo y formato del código PHP de acuerdo con un conjunto predefinido de reglas. Utiliza un motor de análisis estático para recorrer los archivos PHP y aplicar las correcciones necesarias para asegurar que el código cumpla con las convenciones y estándares establecidos.

Ventajas de utilizar PHP-CS-Fixer:

  1. 1 - Mantenimiento de un estilo de código consistente: PHP-CS-Fixer te permite definir y aplicar un estilo de código consistente en todo tu proyecto. Al seguir un conjunto de reglas predefinidas (como PSR-12 o PSR-2) o reglas personalizadas, puedes asegurarte de que todos los desarrolladores en tu equipo sigan las mismas convenciones de codificación, lo que facilita la lectura y comprensión del código.

  2. 2 - Mejora de la calidad del código: Al corregir automáticamente el estilo del código, PHP-CS-Fixer ayuda a eliminar inconsistencias y errores comunes en el formato, como espacios en blanco incorrectos, indentación inconsistente, uso incorrecto de comillas, etc. Esto mejora la calidad general del código y reduce la posibilidad de errores causados por problemas de formato.

  3. 3 - Ahorro de tiempo y esfuerzo: Al automatizar la corrección del estilo del código, PHP-CS-Fixer ahorra tiempo y esfuerzo a los desarrolladores. En lugar de revisar manualmente cada archivo en busca de problemas de formato, la herramienta se encarga de ello, permitiendo a los desarrolladores concentrarse en escribir un código funcional y de alta calidad.


Git Hooks y sus beneficios

Los Git Hooks son scripts personalizados que se ejecutan automáticamente en eventos específicos de Git, como confirmar cambios, empujar cambios, etc. Nos permiten automatizar tareas y establecer políticas de desarrollo para garantizar un flujo de trabajo consistente en nuestro proyecto.

En este caso, configuraremos un hook pre-commit, que se ejecutará antes de cada confirmación de cambios. Utilizaremos este hook para ejecutar phpstan y php-cs-fixer, asegurando así que nuestro código cumpla con los estándares de calidad establecidos.


Instalación y configuración del hook

A continuación, detallaremos los pasos necesarios para instalar y configurar el hook. Para eso crearemos un mini proyecto en laravel

Paso 1: Crear un proyecto e instalar los linters

          
             composer create-project laravel/laravel laravelApp
             cd laravelApp
          
       

A continuación, instalamos phpstan y php-cs-fixer mediante los siguientes comandos:

          
            composer require --dev phpstan/phpstan
            composer require --dev friendsofphp/php-cs-fixer
          
       

Luego, creamos el archivo de configuración .php-cs-fixer.php en la raíz del proyecto y agregamos una configuración básica.

Paso 2: Modificar el archivo composer.json

En el archivo `composer.json`, agregamos las siguientes líneas dentro de la sección "scripts":

          
            "php-stan": "vendor/bin/phpstan analyse app tests --level=4",
            "php-fixer": "vendor/bin/php-cs-fixer fix --config .php-cs-fixer.php",
            "tests": "vendor/bin/phpunit"
          
       

Estos scripts nos permitirán ejecutar phpstan, php-cs-fixer y PHPUnit respectivamente.

Paso 3: Crear un repositorio y enlazarlo con nuestro proyecto

Creamos un repositorio en la plataforma Git de tu elección y, desde la terminal, nos situamos en nuestro proyecto y ejecutamos los siguientes comandos:

          
            git init
            git remote add origin https://github.com/Username/NombreDelRepol.git
            git add .
            git commit -m "Primer commit"
            git push origin main
          
       

Estos comandos inicializarán un repositorio Git, lo enlazarán con nuestro repositorio remoto y realizarán el primer envío de cambios.

Paso 4: Crear el hook

Para configurar el hook pre-commit, creamos la carpeta .githooks en la raíz del proyecto y dentro de ella, creamos el archivo pre-commit con el siguiente contenido:

          
            #!/usr/bin/env bash
            echo "pre commit hook start"

            echo "init tests and phpstan"
            bash -c "composer tests && composer run php-stan" || exit 1

            CHANGED_FILES=$(git diff --cached  --name-only --diff-filter=ACM -- '*.php' | tr '\n' ' ')
            if [ -n "$CHANGED_FILES" ]; then
               echo "init php-fixer"
               bash -c "composer php-fixer $CHANGED_FILES; git add $CHANGED_FILES;"
               echo "finish tests and php-fixer"
            fi
            echo "pre commit hook finish"
          
       

Luego, le damos permisos de ejecución al archivo mediante el siguiente comando:

          
            chmod +x .githooks/pre-commit
          
       

¡Listo! Ahora, cada vez que realices una confirmación de cambios, phpstan y php-cs-fixer se ejecutarán automáticamente, ayudándote a mantener un código limpio y de calidad.

Para finalizar, configuramos Git para que utilice nuestros hooks al realizar confirmaciones de cambios:

          
            git config --local core.hooksPath .githooks/
          
       

Solo me queda animarte a contactarme si tienes alguna duda o sugerencia. Puedes hacerlo a través del formulario de contacto o por medio de mis perfiles en redes sociales.

Espero que este artículo te haya sido de utilidad y no dudes en compartirlo si crees que puede ser de ayuda para otr@s desarrolladores/as.

feliz código a tod@s!!


Enlaces relacionados

Configuraciones para PHP-CS-FIXER

PHPDev, web con ejemplo de configuración para PHP-CS-FIXER

Documentación

298