Automatización del flujo de trabajo de PHP CS Fixer para commits de Git

Todos usamos el PHP Code Style Fixer. ¡A todos nos encanta! Pero no nos gusta hacer clic en el botón "composer fix" cada vez antes de enviar nuestros cambios. Te prometo que te encantará la utilidad Lefthook, porque automatiza una de las acciones más frecuentes en proyectos PHP.

PHP CS fixer visualisation
Уявлення PHP CS Fixer у поєднанні з LeftHook з точки зору ШІ

Tarde o temprano, todo desarrollador en su vida conocerá la alegría de las herramientas automáticas de corrección de código. Esto nos ahorra tiempo y mejora la calidad del código. Sin embargo, con el tiempo, todo desarrollador se enfrenta al problema de automatizar tales procesos. No nos gusta activar manualmente los flujos de trabajo de corrección de código, desperdiciando nuestro tiempo y enfocándonos en cosas tan básicas.

Mi experiencia

He probado diferentes herramientas. Desde commits directos en el directorio .git/hooks hasta Husky. Buscaba una solución perfecta para la automatización de correcciones de código en mis proyectos. Una de las herramientas más populares para tales propósitos es Husky.

¿Por qué no me gusta Husky?

  • Configuración compleja. La configuración de Husky pasa por demasiados pasos y no tiene funciones enriquecidas listas para usar que simplifiquen la configuración.

  • Entorno Node.js. Una herramienta tan simple requiere la instalación de NodeJS. Esto causa una sobrecarga de rendimiento durante la instalación y el uso.

  • Gestión de dependencias. Para instalar Husky debes tener uno de los gestores de paquetes NPM/PNPM/Bun. Cualquiera de ellos llena tu equipo con cosas innecesarias y hace que la configuración de la herramienta sea más compleja.

Encontré la solución perfecta para mí

Revisando la lista de repositorios de GitHub, descubrí la herramienta definitiva para desarrolladores llamada Lefthook. Entonces, ¿por qué me gustó?

  • Uso de lenguaje compilado

    • Excelente rendimiento

    • No se requieren gestores de paquetes ni runtime

    • Puede integrarse con cualquier entorno sin complicaciones

    • Se entrega como un solo binario

  • Sintaxis YAML utilizada para archivos de configuración. YAML es un lenguaje de marcado bien conocido para archivos de configuración en flujos de trabajo de CI en la mayoría de los proyectos, como GitHub Actions. Se utiliza en la mayoría de proyectos de código abierto.

  • La mayoría de las configuraciones se pueden hacer con utilidades integradas. Lefthook tiene un amplio conjunto de opciones de configuración. No es necesario conocer los internos de git para configurar tareas básicas como la corrección automática de código o el lint de código.

  • Buen soporte para monorepos

Configuración de Lefthook con PHP CS Fixer

Demasiada introducción para una acción tan breve. En el momento de escribir este artículo, la última versión de Lefthook es la 1.6.4. Vamos paso a paso.

  • Instala y configura PHP Code Style Fixer como se describe en su Readme.

  • Instala Lefthook de cualquier forma deseada listada en la guía de instalación. En macOS lo hago a través del gestor de paquetes brew: brew install lefthook.

  • Crea un archivo de configuración llamado lefthook.yml en la raíz de tu proyecto. ¡Atención! Debe estar ubicado en la raíz del repositorio git, incluso si usas un monorepo.

  • Pon el siguiente contenido en el archivo lefthook.yml.

    pre-commit:
      commands:
        web-cs-fixer:
          tags: style fixer
          glob: "*.php"
          stage_fixed: true
          run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}
    

Ejecuta el comando lefthook install para aplicar los cambios. ¡Atención! Lefthook utiliza hooks de git bajo el capó, así que después de cualquier actualización del archivo de configuración debes ejecutar lefthook install de nuevo.

Eso es todo. ¡Disfruta codificando!

Explicación de las propiedades

  • La plantilla {staged_files} es una variable integrada que se utiliza para proporcionar una lista de archivos modificados.

  • La propiedad glob se utiliza para filtrar los archivos en los que deseas ejecutar el comando.

    • *.php significa que PHP CS Fixer se ejecutará solo en archivos php, evitando conflictos con otras extensiones.
  • stage_fixed es mi parte favorita. Se encarga de agregar los archivos modificados de vuelta a git (no es necesario ejecutar el comando git add).

  • run contiene el comando que deseas ejecutar antes de cada commit.

Configuración de monorepo

En uno de mis proyectos utilizo un diseño de monorepositorio con Docker. Uno de los contenedores es una aplicación PHP Symfony. Hay una solución sencilla para este caso.

Para ejecutar PHP CS Fixer en un monorepo, existe la propiedad root en la configuración. Actualiza tu lefthook.yml en la raíz del proyecto con la siguiente configuración.

pre-commit:
  commands:
    web-cs-fixer:
      tags: style fixer
      root: "path/to/docker_containers/php_web_app/"
      glob: "*.php"
      stage_fixed: true
      run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}

Reemplaza path/to/docker_containers/php_web_app/ con la ruta a tu directorio de proyecto php. ¡Atención! La ruta debe terminar con una barra inclinada '/'.