prek, reimplementado en Rust, proporciona mecanismos robustos para heredar configuraciones, facilitando la compartición de definiciones estándar en múltiples proyectos del equipo. Esta guía técnica detalla el uso de anclajes YAML para reutilizar configuraciones, reduciendo redundancias y manteniendo coehrencia.
Concepto de herencia de configuración
La herencia permite definir plantillas reutilizables mediante anclajes YAML (&) y referencias (*), optimizando la gestión de configuraciones en entornos multi-proyecto.
Implementaciones básicas
Referencias simples con anclajes
Un enfoque inicial utiliza anclajes para compartir atributos comunes entre hooks:
repos:
- repo: local
hooks:
- id: verificacion-tipo-local
name: Verificación de tipos local
entry: python tools/type_check.py --local
<<: &common_tipos
language: python
types_or: [python, pyi]
- id: verificacion-tipo-ci
name: Verificación de tipos CI
entry: python tools/type_check.py --ci
<<: *common_tipos
El anclaje &common_tipos define propieaddes compartidas, aplicadas vía << en el segundo hook.
Herencia anidada
Se pueden construir jerarquías complejas mediante herencia multinivel:
base_local: &base_local
language: system
pass_filenames: false
require_serial: true
base_commit: &base_commit
<<: *base_local
stages: [pre-commit]
repos:
- repo: local
hooks:
- id: prueba-formato
name: Prueba de formato YAML
entry: prek --validate
<<: *base_commit
La configuración base_commit hereda de base_local y agrega stages, reduciendo duplicación.
Casos de uso prácticos
Compartir reglas entre proyectos
Definir un archivo base (.prek_base.yaml) con verificaciones comunes:
repos:
- repo: https://example.com/repos/checks
rev: v2.0.0
hooks:
- id: validador-yaml
<<: ®las_base
language: system
stages: [pre-commit]
- id: validador-json
<<: *reglas_base
Luego, en proyectos individuales (.prek.yaml):
<<: !include .prek_base.yaml
repos:
- repo: local
hooks:
- id: chequeo-proyecto
<<: *reglas_base
entry: ./scripts/custom_check.sh
Variantes por entorno
Crear configuraciones diferenciadas para desarrollo y producción:
base_pruebas: &base_pruebas
language: python
types: [python]
require_serial: true
pruebas_dev: &pruebas_dev
<<: *base_pruebas
args: [--modo-desarrollo]
pruebas_prod: &pruebas_prod
<<: *base_pruebas
args: [--estricto]
Mejores prácticas
- Mantener configuraciones base minimalistas, evitando especificidades de proyectos.
- Usar nombres descriptivos para anclajes (ej. &python_base) en lugar de genéricos.
- Limitar herencias a 2-3 niveles para mantener legibilidad.
- Documentar anclajes con comentarios explicativos.
- Revisar periódicamente la aplicabilidad de las configuraciones heredadas.
Solución de problemas
Conflictos de combinación
Las configuraciones locales sobreescriben las heredadas:
base: &base
language: python
args: [--opción1]
hook:
<<: *base
args: [--opción2] # Sobreescribe args de base
Referencias circulares
Evitar ciclos que impidan el análisis:
a: &a
<<: *b # Error: b no definido aún
b: &b
<<: *a
Limitaciones entre archivos
No se permite referenciar anclajes directamente entre archivos; usar !include primero para encorporar definiciones.