As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Uso de estratégias de mesclagem para gerar pacotes e especificar arquivos
Você pode usar estratégias de mesclagem para gerar pacotes com ressíntese e especificar arquivos para atualizações de gerenciamento do ciclo de vida de esquemas personalizados. Ao aproveitar as estratégias de ressíntese e mesclagem, você pode gerenciar atualizações e controlar quais arquivos são atualizados durante as implantações. Você também pode escrever suas próprias estratégias para controlar como as alterações são mescladas aos projetos existentes do CodeCatalyst.
Tópicos
Gerar arquivos com ressíntese
A ressíntese pode mesclar o código-fonte produzido por um esquema com o código-fonte que foi gerado anteriormente pelo mesmo esquema, permitindo que as alterações em um esquema sejam propagadas para projetos existentes. As mesclagens são executadas a partir da função resynth()
nos pacotes de saída do esquema. A ressíntese primeiro gera três pacotes que representam diferentes aspectos do esquema e do estado do projeto. Ela pode ser executada manualmente no local com o comando yarn blueprint:resynth
, que criará os pacotes se eles ainda não existirem. Trabalhar manualmente com os pacotes permitirá que você simule e teste o comportamento da ressíntese localmente. Por padrão, os esquemas só executam a ressíntese nos repositórios em src/*
, já que somente essa parte do pacote normalmente está sob controle de origem. Para ter mais informações, consulte Ressíntese.
-
existing-bundle
- Esse pacote é uma representação do estado existente do projeto. Ele é construído artificialmente pela computação de síntese para fornecer ao esquema um contexto sobre o que está no projeto em que está sendo implantado (se houver). Se algo já existir nesse local ao executar a ressíntese localmente, ele será redefinido e respeitado como uma simulação. Caso contrário, ele será definido como o conteúdo doancestor-bundle
. -
ancestor-bundle
- Esse é o pacote que representa a saída do esquema se tiver sido sintetizado com algumas opções e/ou versões anteriores. Se for a primeira vez que esse esquema está sendo adicionado a um projeto, o ancestral não existe, e ele está definido com o mesmo conteúdo doexisting-bundle
. Localmente, se esse pacote já existir, ele será respeitado como uma simulação. -
proposed-bundle
- Esse é o pacote que simula o esquema se tiver sido sintetizado com algumas novas opções e/ou versões. Esse é o mesmo pacote que seria produzido pela funçãosynth()
. Localmente, esse pacote sempre é substituído.
Cada pacote é criado durante uma fase de ressíntese que pode ser acessada a partir da classe de esquema em this.context.resynthesisPhase
.
resolved-bundle
- Esse é o pacote final, que é uma representação do que é empacotado e implantado em um projeto do CodeCatalyst. Você pode ver quais arquivos e diffs são enviados para os mecanismos de implantação. Essa é a saída da funçãoresynth()
que resolve mesclagens entre os outros três pacotes.
A mesclagem de três vias é aplicada tomando a diferença entre o ancestor-bundle
e proposed-bundle
e adicionando-a ao existing-bundle
para gerar o resolved-bundle
. Todas as estratégias de mesclagem resolvem arquivos para o resolved-bundle
. A ressíntese resolve o alcance desses pacotes com as estratégias de mesclagem do esquema durante resynth()
e produz o pacote resolvido no resultado.
Usar estratégias de mesclagem
Você pode usar uma estratégia de mesclagem oferecida pela biblioteca de esquemas. Essas estratégias fornecem maneiras de resolver saídas de arquivos e conflitos para arquivos mencionados na seção Gerar arquivos com ressíntese.
-
alwaysUpdate
- Uma estratégia que sempre se resolve com o arquivo proposto. -
neverUpdate
- Uma estratégia que sempre se resolve com o arquivo existente. -
onlyAdd
- Uma estratégia que se resolve com o arquivo proposto quando um arquivo existente ainda não existe. Caso contrário, se resolve com o arquivo existente. -
threeWayMerge
- Uma estratégia que executa uma fusão tripla entre os arquivos ancestrais existentes, propostos e comuns. O arquivo resolvido pode conter marcadores de conflito se os arquivos não puderem ser mesclados de forma limpa. O conteúdo dos arquivos fornecidos deve ser codificado em UTF-8 para que a estratégia produza uma saída significativa. A estratégia tenta detectar se os arquivos de entrada são binários. Se a estratégia detectar um conflito de mesclagem em um arquivo binário, ela sempre retornará o arquivo proposto. -
preferProposed
- Uma estratégia que executa uma fusão tripla entre os arquivos ancestrais existentes, propostos e comuns. Essa estratégia resolve conflitos selecionando o lado do arquivo proposto de cada conflito. -
preferExisting
- Uma estratégia que executa uma fusão tripla entre os arquivos ancestrais existentes, propostos e comuns. Essa estratégia resolve conflitos selecionando o lado do arquivo existente de cada conflito.
Para ver o código-fonte das estratégias de mesclagem, consulte o repositório de código aberto do GitHub
Especificação de arquivos para atualizações de gerenciamento do ciclo de vida
Durante a ressíntese, os esquemas controlam como as alterações são mescladas em um repositório de origem existente. No entanto, você talvez não queira enviar atualizações para todos os arquivos do seu esquema. Por exemplo, códigos de exemplo, como folhas de estilo CSS, devem ser específicos do projeto. A estratégia de mesclagem de três vias é a opção padrão se você não especificar outra estratégia. Os esquemas podem especificar quais arquivos possuem e quais não possuem, especificando estratégias de mesclagem no próprio constructo do repositório. Os esquemas podem atualizar as estratégias de mesclagem, e as estratégias mais recentes podem ser usadas durante a ressíntese.
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/**', ], }, ]);
Várias estratégias de mesclagem podem ser especificadas, e a última estratégia tem precedência. Os arquivos descobertos usam como padrão uma mesclagem de três vias semelhante ao Git. Existem várias estratégias de mesclagem fornecidas por meio do constructo MergeStrategies
, mas você pode escrever a sua própria. As estratégias fornecidas seguem o driver de estratégia de mesclagem do Git
Escrita de estratégias de mesclagem
Além de usar uma das estratégias de mescla de compilações fornecidas, você também pode escrever suas próprias estratégias. As estratégias devem seguir uma interface padrão. Você deve escrever uma função de estratégia que pegue versões de um arquivo do existing-bundle
, do proposed-bundle
e do ancestor-bundle
, e mesclá-las em um único arquivo resolvido. Por exemplo:
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;
Se os arquivos não existirem (forem indefinidos), esse caminho de arquivo não existirá nesse pacote de localização específico.
Exemplo:
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/**', ], }, ],