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 paquetes y especificar archivos
Puede utilizar estrategias de combinación para generar lotes con resíntesis y especificar archivos para la gestión del ciclo de vida de las actualizaciones de los planos personalizados. Al aprovechar las estrategias de resíntesis y fusió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 existentes. CodeCatalyst
Temas
Generar archivos con resíntesis
La resíntesis puede combinar el código fuente producido por un plano con el código fuente generado previamente por el mismo modelo, lo que permite propagar los cambios en un plano a los proyectos existentes. Las fusiones se ejecutan desde la función en todos los paquetes de salida del blueprint. resynth()
La resíntesis primero genera tres paquetes que representan diferentes aspectos del plano y del estado del proyecto. Se puede ejecutar manualmente de forma local con el yarn blueprint:resynth
comando, que creará los paquetes si aún no existen. Trabajar manualmente con los paquetes le permitirá simular y probar el comportamiento de la resíntesis localmente. De forma predeterminada, los blueprints solo ejecutan la resíntesis en los repositorios en los que se encuentran, src/*
ya que normalmente solo esa parte del paquete está bajo el control de código fuente. Para obtener más información, consulte Resíntesis.
-
existing-bundle
- Este paquete es una representación del estado del proyecto existente. El cálculo de síntesis lo construye artificialmente para dar al modelo un contexto sobre el contenido del proyecto en el que se va a implementar (si es que hay algo). Si algo ya existe en esta ubicación al ejecutar la resíntesis localmente, se restablecerá y se respetará como un simulacro. De lo contrario, se ajustará al contenido de.ancestor-bundle
-
ancestor-bundle
- Este es el paquete que representa el resultado del plano si se sintetizó con algunas opciones o versiones anteriores. Si es la primera vez que se agrega este plano a un proyecto, entonces el antepasado no existe, por lo que tiene el mismo contenido que el.existing-bundle
A nivel local, si este paquete ya existe en esta ubicación, se respetará como un simulacro. -
proposed-bundle
- Este es el paquete que se burla del modelo si se ha sintetizado con nuevas opciones o versiones. Es el mismo paquete que generaría lasynth()
función. A nivel local, este paquete siempre se anula.
Cada paquete se crea durante una fase de resíntesis a la que se puede acceder desde la clase de blueprint que aparece a continuación. this.context.resynthesisPhase
resolved-bundle
- Este es el paquete final, que es una representación de lo que se empaqueta y se implementa en un proyecto. CodeCatalyst Puede ver qué archivos y diferencias se envían a los mecanismos de despliegue. Este es el resultado de laresynth()
función que resuelve las fusiones entre los otros tres paquetes.
La combinación a tres bandas se aplica tomando la diferencia entre ancestor-bundle
y proposed-bundle
y sumándola a la para generar laexisting-bundle
. resolved-bundle
Todas las estrategias de fusión resuelven los resolved-bundle
archivos en. La resíntesis resuelve el alcance de estos paquetes con las estrategias de fusión del plan durante el proceso resynth()
y produce el paquete resuelto a partir del resultado.
Uso de estrategias de fusión
Puede utilizar una estrategia de fusión que ofrece la biblioteca de planos. Estas estrategias proporcionan formas de resolver las salidas de archivos y los conflictos relacionados con los archivos mencionados en la Generar archivos con resíntesis sección.
-
alwaysUpdate
- Una estrategia que siempre se dirija al archivo propuesto. -
neverUpdate
- Una estrategia que siempre se dirija al archivo existente. -
onlyAdd
- Una estrategia que se convierte 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 realiza una fusión a tres bandas entre los archivos existentes, propuestos y ancestros 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 fusión en un archivo binario, siempre devuelve el archivo propuesto. -
preferProposed
- Una estrategia que realiza una fusión a tres bandas entre los archivos existentes, los propuestos y los archivos ancestrales comunes. Esta estrategia resuelve los conflictos seleccionando el lado del archivo propuesto en cada conflicto. -
preferExisting
- Una estrategia que realiza una fusión a tres bandas entre los archivos existentes, los propuestos y los archivos ancestrales 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 fusión, consulta el GitHub repositorio de código abierto
Especificar archivos para las actualizaciones de la administración del ciclo de vida
Durante la resíntesis, los planos controlan la forma en que se combinan los cambios en un repositorio de origen existente. Sin embargo, es posible que no desee enviar actualizaciones a todos los archivos del blueprint. Por ejemplo, los códigos de ejemplo, como las CSS hojas de estilo, están pensados para ser específicos del proyecto. La estrategia de fusión a tres bandas es la opción predeterminada si no especificas otra estrategia. Los blueprints pueden especificar qué archivos son de su propiedad y cuáles no especificando las estrategias de combinación en la propia construcción del repositorio. Los planos pueden actualizar sus estrategias de fusió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 fusión, y la última estrategia tiene prioridad. Los archivos descubiertos three-way-merge tienen un valor predeterminado similar a Git. La MergeStrategies
construcción incluye varias estrategias de fusión, pero puedes escribir las tuyas propias. Las estrategias proporcionadas se adhieren al motor de estrategia de fusión de git
Escribir estrategias de fusión
Además de utilizar una de las estrategias de construcción y fusión que se proporcionan, también puedes escribir tus propias estrategias. Las estrategias deben seguir una interfaz de estrategia estándar. Debe escribir una función de estrategia que tome versiones de un archivo de existing-bundle
proposed-bundle
, yancestor-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 los archivos no existen (no están definidos), entonces la ruta del archivo no existe en ese paquete de ubicaciones 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/**', ], }, ],