Ir al contenido

Guía para desarrolladores de Backport Builder

Backport Builder es un proyecto de ingeniería de versiones. Trata los repositorios de origen como entradas, los árboles generados como salidas y las reglas personalizadas de Rector como lógica de compilación probada.

Usar esta guía al mantener reglas de downgrade, metadatos de paquetes generados, comprobaciones del runtime de destino o automatización de versiones en torno a nextpdf/backport-builder.

CapaPropiedad deResponsabilidadNo pongas aquí
Repositorios de origenRepositorios de productoCódigo fuente PHP autoritativo y pruebas.Ediciones de downgrade generadas.
Scripts de compilaciónnextpdf/backport-builderFusionan el origen, ejecutan las transformaciones, escriben los metadatos y validan la salida.Lógica de aplicación en runtime.
Configuración de Rectornextpdf/backport-builderPolítica de downgrade específica del destino.Suposiciones entre destinos sin pruebas.
Reglas personalizadas de Rectornextpdf/backport-builderTransformaciones de sintaxis específicas del proyecto.Reescrituras amplias sin pruebas.
Paquetes generadosSalida de compilaciónArtefactos instalables para runtimes antiguos.Parches manuales en la fuente de la verdad.
EtapaComportamientoAcción del desarrollador
Checkout del origenEl flujo de trabajo de versión hace checkout de los repositorios de origen en la etiqueta de destino.Mantener alineadas las referencias de origen entre los paquetes.
Validación del contratoValidateBuildContract::run() comprueba las suposiciones de compilación.Trata un contrato fallido como un bloqueo de la versión.
FusiónMergeSources::run() ensambla el árbol del paquete de destino.Verifica el alcance del destino antes de ejecutar Rector.
TransformaciónLas configuraciones de Rector y las reglas personalizadas hacen downgrade de la sintaxis.Añade pruebas de fixtures para cada cambio de regla.
Ajuste de ComposerAdjustComposer escribe los metadatos del paquete generado y los mapas de reemplazo.Valida los nombres de paquete, la versión, la licencia y las restricciones.
Validación en runtimeLa salida generada se comprueba sintácticamente y se prueba en las versiones de PHP de destino.Trata un fallo del runtime de destino como un bloqueo de la versión.
VersiónLos archivos comprimidos se adjuntan a una versión.No parchear la salida generada como fuente de la verdad.

Flujo de trabajo recomendado del repositorio

Sección titulada «Flujo de trabajo recomendado del repositorio»
Elemento de trabajoFuente de la verdadPolítica de la salida generada
Uso de características de PHPRepositorio de origen principal.Las reglas de backport adaptan la característica.
Restricciones de dependenciasMetadatos del composer.json de origen más el script de ajuste.El composer.json generado debe ser reproducible.
Downgrade de sintaxisConfiguración de Rector y reglas personalizadas.El código fuente generado no debe editarse manualmente.
Compatibilidad con runtimeRama de destino y matriz de CI.La compilación debe pasar en el PHP de destino.
Notas de la versiónDocumentación y automatización de versiones.Los artefactos generados deben enlazar de nuevo con la versión de origen.

Patrón para reglas personalizadas de Rector

Sección titulada «Patrón para reglas personalizadas de Rector»

Cada regla personalizada debe tener un propósito acotado, metadatos y cobertura mediante fixtures.

Método de la reglaPropósitoRequisito de calidad
getRuleDefinition()Documenta la transformación para las herramientas de Rector.Incluye una muestra before/after que coincida con el downgrade real.
getNodeTypes()Limita los nodos del AST que inspecciona la regla.Mantén la lista de nodos lo más pequeña posible.
refactor()Aplica la transformación o devuelve el nodo sin cambios.Deja intactos y de forma determinista los nodos no relacionados.
Prueba de fixtureVerifica la salida before/after.Cubre la entrada válida más pequeña y al menos un caso que se omite.
<?php
final class ExampleDowngradeRector extends AbstractRector
{
public function getNodeTypes(): array
{
return [SomeNode::class];
}
public function refactor(Node $node): ?Node
{
if (!$node instanceof SomeNode) {
return null;
}
return $this->rewriteNode($node);
}
}

Usar ejecuciones en seco durante el desarrollo y la validación de candidatas a versión. Usar la salida real solo cuando se conozcan las referencias de origen y la rama de destino.

Ventana de terminal
composer build:dry
php scripts/build.php --version=2.0.0 --target=php81 --dry-run
php scripts/build.php --version=2.0.0 --target=php74 --no-pro

La validación del paquete generado debe ejecutarse en el runtime de destino, no solo en el host de compilación moderno.

Punto de extensiónÚsalo paraRestricción
Archivos de configuración de RectorPolítica de downgrade específica del destino.Mantener separados los carriles de PHP 8.1 y PHP 7.4.
Reglas personalizadas de RectorTransformaciones de sintaxis específicas del proyecto.Deben tener metadatos y pruebas de fixtures.
Script de ajuste de ComposerIdentidad del paquete generado.Debe preservar el versionado alineado con SemVer.
Script de fusiónSelección y modelado de la entrada de paquetes de origen.Debe registrar las raíces de origen y las raíces de salida.
Flujo de trabajo de compilaciónOrquestación de versiones.Debe validar la salida generada en el runtime de destino.
  1. Reproducir la sintaxis no compatible en un fixture mínimo.
  2. Añadir o actualizar una regla personalizada de Rector.
  3. Añadir fixtures before/after para la regla.
  4. Ejecutar la compilación en seco.
  5. Validar la salida generada en el runtime de PHP de destino.
  6. Aplicar el mismo cambio lógico a cada rama de destino permanente cuando sea necesario.
  7. Mantener los artefactos de versión reproducibles a partir de las etiquetas de origen y los scripts de compilación.
FalloDónde debe manejarseRespuesta recomendada
Falta el repositorio de origenEtapa de validación del contrato o de fusión.Detener la compilación y corregir las entradas del checkout.
Fallo de análisis de RectorEtapa de transformación.Reducirlo a un fixture y actualizar la regla o la configuración.
Discrepancia del composer.json generadoEtapa de ajuste de Composer.Corrige el script de generación, no los metadatos generados.
Fallo de sintaxis de destinoValidación en runtime.Bloquea la versión hasta que se corrija la transformación.
Origen Pro no disponibleConfiguración de compilación.Compila el artefacto público solo cuando ese sea el destino previsto.
AspectoPredeterminadoCuándo anularlo
Salida generadaArtefacto de solo lectura.Nunca convertirla en la fuente de la verdad.
Modelo de ramasRamas de destino permanentes separadas.Mantener los cambios sincronizados mediante pull requests independientes.
Host de compilaciónPHP moderno.La validación del runtime de destino sigue decidiendo si la versión está lista.
Reglas personalizadasPequeñas y respaldadas por fixtures.Evitar las transformaciones amplias sin ejemplos before/after explícitos.
Carril de PHP 7.4Solo el core, salvo que se admita explícitamente.No incluir la salida Pro sin validación del runtime de destino.
  • Las pruebas de metadatos de reglas de Rector instancian cada regla personalizada.
  • Las pruebas de fixtures cubren el código antes y después de cada transformación.
  • La compilación en seco se ejecuta antes de los jobs de versión.
  • Las comprobaciones de sintaxis del runtime de destino y las pruebas de paquete se ejecutan sobre la salida generada.
  • Las pruebas de metadatos de Composer verifican el nombre del paquete, la versión, las restricciones, el mapa de reemplazo y la licencia.
  • Los logs de compilación incluyen las rutas de origen, la ruta de destino, el runtime de destino, el estado de la ejecución en seco y el estado de inclusión de Pro.