使用合并策略生成捆绑包并指定文件 - Amazon CodeCatalyst

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用合并策略生成捆绑包并指定文件

生成带有重新合成功能的文件

Resynthesis 可以将蓝图生成的源代码与之前由同一蓝图生成的源代码合并,从而允许将对蓝图的更改传播到现有项目。通过resynth()函数跨蓝图输出包进行合并。Resynthesis 首先生成三个包,分别代表蓝图和项目状态的不同方面。可以使用yarn blueprint:resynth命令在本地手动运行它,如果捆绑包尚不存在,则该命令将创建捆绑包。手动使用捆绑包将允许您在本地模拟和测试重新合成行为。默认情况下,蓝图仅在下的存储库中运行重新合成,src/*因为通常只有捆绑包的该部分受源代码控制。

  • existing-bundle-此捆绑包代表现有项目状态。这是由合成计算人为构造的,目的是为其部署到的项目中的内容(如果有的话)提供蓝图上下文。如果在本地运行 resynthess 时此位置已经存在某些内容,则它将被重置并视为模拟。否则,它将设置为的内容ancestor-bundle

  • ancestor-bundle-如果蓝图输出是用一些以前的选项和/或版本合成的,则此捆绑包代表蓝图输出。如果这是首次将此蓝图添加到项目中,则其祖先不存在,因此将其设置为与相同的existing-bundle内容。在本地,如果此分发包已存在于此位置,则会将其视为模拟。

  • proposed-bundle-如果蓝图是用一些新选项和/或版本合成的,则这个捆绑包会模拟蓝图。这与该synth()函数生成的捆绑包相同。在本地,此捆绑包始终被覆盖。

每个捆绑包都是在重新合成阶段创建的,可以从下的蓝图类中访问该包。this.context.resynthesisPhase

  • resolved-bundle-这是最后一个捆绑包,它代表了打包并部署到 CodeCatalyst 项目中的内容。您可以查看哪些文件和差异已发送到部署机制。这是解析其他三个捆绑包之间合并的resynth()函数的输出。

应用三向合并的方法是取ancestor-bundle和之间的差值,proposed-bundle然后将其添加到中existing-bundle以生成。resolved-bundle所有合并策略都将文件解析为resolved-bundle。Resynthesis 使用蓝图的合并策略解析这些捆绑包的覆盖范围,resynth()并根据结果生成已解析的捆绑包。

使用合并策略

您可以使用蓝图库提供的合并策略。这些策略提供了解决本生成带有重新合成功能的文件节中提到的文件输出和文件冲突的方法。

  • alwaysUpdate-一种始终解析为建议文件的策略。

  • neverUpdate-一种始终解析到现有文件的策略。

  • onlyAdd-一种在现有文件尚不存在时解析为建议文件的策略。否则,解析为现有文件。

  • threeWayMerge-一种在现有的、提议的和共同的祖先文件之间进行三向合并的策略。如果无法干净地合并文件,则已解析的文件可能包含冲突标记。提供的文件内容必须采用 UTF-8 编码,策略才能生成有意义的输出。该策略尝试检测输入文件是否为二进制文件。如果该策略检测到二进制文件中存在合并冲突,则始终返回建议的文件。

  • preferProposed-一种在现有的、提议的和共同的祖先文件之间进行三向合并的策略。此策略通过选择每个冲突中建议文件的一方来解决冲突。

  • preferExisting-一种在现有的、提议的和共同的祖先文件之间进行三向合并的策略。此策略通过选择每个冲突的现有文件一方来解决冲突。

要查看合并策略的源代码,请参阅开源 GitHub 存储库

为生命周期管理更新指定文件

在重新合成期间,蓝图控制如何将更改合并到现有源存储库中。但是,您可能不想将更新推送到蓝图中的每个文件。例如,像 CSS 样式表这样的示例代码旨在针对特定项目。如果您未指定其他策略,则三向合并策略是默认选项。蓝图可以通过在存储库构造本身上指定合并策略来指定他们拥有哪些文件和不拥有哪些文件。蓝图可以更新其合并策略,并且可以在重新合成期间使用最新的策略。

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/**', ], }, ]);

可以指定多个合并策略,最后一个策略优先。未发现的文件默认为与 Git three-way-merge 类似。通过MergeStrategies构造提供了几种合并策略,但你可以自己编写。提供的策略符合 git 合并策略驱动程序。

编写合并策略

除了使用提供的构建合并策略之一外,您还可以编写自己的策略。策略必须遵循标准的策略接口。您必须编写一个策略函数,用于从、和existing-bundle、中获取文件版本 proposed-bundleancestor-bundle,并将它们合并到单个已解析文件中。例如:

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;

如果文件不存在(未定义),则该文件路径在该特定位置包中不存在。

示例

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/**', ], }, ],