Heredando configuraciones en prek: Guía para compartir definiciones base entre proyectos

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
        <<: &reglas_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.

Etiquetas: prek YAML herencia de configuración pre-commit Rust

Publicado el 6-20 23:54