Uso de estrategias de combinación para generar agrupaciones y especificar archivos - Amazon CodeCatalyst

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de estrategias de combinación para generar agrupaciones y especificar archivos

Puede utilizar estrategias de combinación para generar agrupaciones con resíntesis y especificar archivos para la actualización de la administración del ciclo de vida de los esquemas personalizados. Gracias a las estrategias de resíntesis y combinación, puede administrar las actualizaciones y controlar qué archivos se actualizan durante las implementaciones. También puede diseñar sus propias estrategias para controlar cómo se combinan los cambios en los proyectos de CodeCatalyst actuales.

Generación de archivos con resíntesis

La resíntesis puede combinar el código fuente generado por un esquema con el código fuente generado previamente por el mismo esquema, de modo que los cambios en el esquema se propaguen a los proyectos actuales. Las combinaciones se ejecutan desde la función resynth() en todas las agrupaciones de salida de un esquema. En primer lugar, la resíntesis genera tres agrupaciones, que representan diferentes aspectos del estado del proyecto y del esquema. Se puede ejecutar manualmente de forma local con el comando yarn blueprint:resynth, lo que creará las agrupaciones si aún no existen. El trabajo manual con las agrupaciones le permitirá simular y probar el comportamiento de la resíntesis de manera local. De forma predeterminada, los esquemas solo ejecutan la resíntesis en los repositorios que se encuentran bajo src/*, ya que, normalmente, esa parte de la agrupación es la única bajo el control del código fuente. Para obtener más información, consulte Resíntesis.

  • existing-bundle: esta agrupación es una representación del estado del proyecto existente. El recurso de computación de la síntesis construye artificialmente esta agrupación para darle al esquema un contexto sobre el contenido del proyecto en el que se va a implementar (en caso de que haya contenido). Si ya hay algo en esta ubicación al ejecutar la resíntesis localmente, se restablecerá y se tratará como una simulación. De lo contrario, se ajustará al contenido de la ancestor-bundle.

  • ancestor-bundle: la agrupación que representa la salida del esquema si se ha sintetizado con algunas opciones o versiones anteriores. Si es la primera vez que se añade este esquema a un proyecto, no hay ningún antecesor, por lo que se configurará con el mismo contenido que la existing-bundle. En el ámbito local, si esta agrupación ya existe en esta ubicación, se tratará como una simulación.

  • proposed-bundle: la agrupación que simula la salida del esquema si se ha sintetizado con algunas opciones o versiones nuevas. Es la misma agrupación que generaría la función synth(). En el ámbito local, esta agrupación siempre se anula.

Todas las agrupaciones se crean durante una fase de resíntesis a la que se puede acceder desde la clase de esquema bajo this.context.resynthesisPhase.

  • resolved-bundle- la agrupación final, que es una representación de lo que se empaqueta e implementa en un proyecto de CodeCatalyst; puede ver qué archivos y diferencias se envían a los mecanismos de implementación. Es la salida de la función resynth(), que resuelve las combinaciones entre las otras tres agrupaciones.

La combinación triple se aplica tomando la diferencia entre la ancestor-bundle y la proposed-bundle, y sumando eso a la existing-bundle para generar la resolved-bundle. Todas las estrategias de combinación resuelven archivos en la resolved-bundle. La resíntesis resuelve el alcance de estas agrupaciones con las estrategias de combinación del esquema durante resynth(), y genera la agrupación resuelta a partir del resultado.

Uso de estrategias de combinación

Puede utilizar una estrategia de combinación ofrecida por la biblioteca de esquemas. Estas estrategias proporcionan formas de resolver las salidas de archivos, así como los conflictos relacionados con archivos mencionados en la sección Generación de archivos con resíntesis.

  • alwaysUpdate: una estrategia que siempre se resuelve en el archivo propuesto.

  • neverUpdate: una estrategia que siempre se resuelve en el archivo existente.

  • onlyAdd: una estrategia que se resuelve en el archivo propuesto cuando aún no existe un archivo existente; de lo contrario, se resuelve en el archivo existente.

  • threeWayMerge: una estrategia que lleva a cabo una combinación triple entre los archivos existentes, los propuestos y los antecesores comunes. El archivo resuelto puede contener marcadores de conflicto si los archivos no se pueden combinar de forma limpia. El contenido de los archivos proporcionados debe estar codificado en UTF-8 para que la estrategia produzca resultados significativos. La estrategia intenta detectar si los archivos de entrada son binarios. Si la estrategia detecta un conflicto de combinación en un archivo binario, siempre devuelve el archivo propuesto.

  • preferProposed: una estrategia que lleva a cabo una combinación triple entre los archivos existentes, los propuestos y los antecesores comunes. Esta estrategia resuelve los conflictos seleccionando el lado del archivo propuesto en cada conflicto.

  • preferExisting: una estrategia que lleva a cabo una combinación triple entre los archivos existentes, los propuestos y los antecesores comunes. Esta estrategia resuelve los conflictos seleccionando el lado del archivo existente en cada conflicto.

Para ver el código fuente de las estrategias de combinación, consulte el repositorio de código abierto en GitHub.

Especificación de archivos para las actualizaciones de la administración del ciclo de vida

Durante la resíntesis, los esquemas controlan cómo se combinan los cambios en un repositorio de código fuente existente. Sin embargo, es posible que no desee enviar actualizaciones a todos los archivos de un esquema. Por ejemplo, el código de muestra, como las hojas de estilo CSS, está creado para que sea específico para un proyecto. La estrategia de combinación triple es la opción predeterminada si no especifica otra estrategia. Mediante la determinación de estrategias de combinación en el constructo del repositorio, los esquemas pueden especificar qué archivos son de su propiedad y cuáles no. Los esquemas pueden actualizar las estrategias de combinación, y las estrategias más recientes se pueden utilizar durante la resíntesis.

const sourceRepo = new SourceRepository(this, { title: 'my-repo', }); sourceRepo.setResynthStrategies([ { identifier: 'dont-override-sample-code', description: 'This strategy is applied accross all sample code. The blueprint will create sample code, but skip attempting to update it.', strategy: MergeStrategies.neverUpdate, globs: [ '**/src/**', '**/css/**', ], }, ]);

Se pueden especificar varias estrategias de combinación y la última estrategia es la que tiene prioridad. Los archivos descubiertos utilizan de forma predeterminada una combinación triple similar a Git. Mediante el constructo de MergeStrategies se proporcionan varias estrategias de combinación, pero puede escribir las suyas. Las estrategias proporcionadas se adhieren al controlador de estrategias de combinación de Git.

Escritura de estrategias de combinación

Además de utilizar una de las estrategias de construcción y combinación proporcionadas, también puede escribir sus propias estrategias. Las estrategias deben adherirse a una interfaz de estrategia estándar. Debe escribir una función de estrategias que tome versiones de un archivo desde la existing-bundle, la proposed-bundle y la ancestor-bundle y las combine en un único archivo resuelto. Por ejemplo:

type StrategyFunction = ( /** * file from the ancestor bundle (if it exists) */ commonAncestorFile: ContextFile | undefined, /** * file from the existing bundle (if it exists) */ existingFile: ContextFile | undefined, /** * file from the proposed bundle (if it exists) */ proposedFile: ContextFile | undefined, options?: {}) /** * Return: file you'd like in the resolved bundle * passing undefined will delete the file from the resolved bundle */ => ContextFile | undefined;

Si no hay archivos (o no están definidos), la ruta del archivo no existirá en la agrupación de esa ubicación en particular.

Ejemplo:

strategies: [ { identifier: 'dont-override-sample-code', description: 'This strategy is applied across all sample code. The blueprint will create sample code, but skip attempting to update it.', strategy: (ancestor, existing, proposed) => { const resolvedfile = ... ... // do something ... return resolvedfile }, globs: [ '**/src/**', '**/css/**', ], }, ],