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.
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 comandogit 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 '/'.