マージ戦略を使用してバンドルを生成し、ファイルを指定する - Amazon CodeCatalyst

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

マージ戦略を使用してバンドルを生成し、ファイルを指定する

再合成によるファイルの生成

再合成では、ブループリントによって生成されたソースコードを、同じブループリントによって以前に生成されたソースコードとマージできるため、ブループリントへの変更を既存のプロジェクトに伝達できます。マージは、設計図出力バンドル全体でresynth()関数から実行されます。再合成では、まず設計図とプロジェクトの状態のさまざまな側面を表す 3 つのバンドルが生成されます。yarn blueprint:resynth コマンドを使用してローカルで手動で実行できます。これにより、バンドルが存在しない場合はバンドルが作成されます。バンドルを手動で操作すると、再合成動作をモックしてローカルでテストできます。デフォルトでは、バンドルのその部分のみが通常出典管理下にあるsrc/*ため、ブループリントは のリポジトリ間でのみ再合成を実行します。

  • existing-bundle - このバンドルは、既存のプロジェクトの状態を表します。これは、合成コンピューティングによって人工的に構築され、デプロイ先のプロジェクトの内容 (ある場合) に関する設計図コンテキストを提供します。再合成をローカルで実行するときに、この場所に既に存在するものがある場合、リセットされ、モックとして認識されます。それ以外の場合は、 の内容に設定されますancestor-bundle

  • ancestor-bundle - これは、以前のオプションやバージョンで合成された場合に設計図出力を表すバンドルです。このブループリントをプロジェクトに初めて追加する場合、祖先が存在しないため、 と同じコンテンツに設定されますexisting-bundle。ローカルでは、このバンドルがこの場所に既に存在する場合、モックとして扱われます。

  • proposed-bundle - これは、いくつかの新しいオプションやバージョンで合成された場合に、設計図をモックするバンドルです。これは、synth()関数によって生成されるバンドルと同じです。ローカルでは、このバンドルは常に上書きされます。

各バンドルは再合成フェーズ中に作成され、 のブループリントクラスからアクセスできますthis.context.resynthesisPhase

  • resolved-bundle - これは最終バンドルであり、パッケージ化されて CodeCatalyst プロジェクトにデプロイされる内容を表します。デプロイメカニズムに送信されるファイルと差分を表示できます。これは、他の 3 つのバンドル間のマージを解決するresynth()関数の出力です。

3 方向マージは、 ancestor-bundle と の違いを考慮しproposed-bundle、それを に追加existing-bundleして を生成することによって適用されますresolved-bundle。すべてのマージ戦略は、ファイルを に解決しますresolved-bundle。再合成は、 中にブループリントのマージ戦略を使用してこれらのバンドルの到達範囲を解決resynth()し、結果から解決されたバンドルを生成します。

マージ戦略の使用

ブループリントライブラリが提供するマージ戦略を使用できます。これらの戦略は、 再合成によるファイルの生成セクションで説明されているファイルの出力と競合を解決する方法を提供します。

  • alwaysUpdate - 常に提案されたファイルに解決される戦略。

  • neverUpdate - 常に既存のファイルに解決される戦略。

  • onlyAdd - 既存のファイルがまだ存在しない場合に、提案されたファイルに解決される戦略。それ以外の場合、 は既存のファイルに解決されます。

  • threeWayMerge - 既存の祖先ファイル、提案された祖先ファイル、一般的な祖先ファイル間で 3 方向のマージを実行する戦略。ファイルをクリーンにマージできない場合、解決されたファイルに競合マーカーが含まれている可能性があります。戦略が意味のある出力を生成するには、提供されたファイルのコンテンツが UTF-8 でエンコードされている必要があります。戦略は、入力ファイルがバイナリであるかどうかを検出しようとします。戦略がバイナリファイル内のマージ競合を検出すると、常に提案されたファイルを返します。

  • preferProposed - 既存の祖先ファイル、提案された祖先ファイル、一般的な祖先ファイルの間で 3 方向のマージを実行する戦略。この戦略では、各競合の提案されたファイルの側を選択して競合を解決します。

  • preferExisting - 既存の祖先ファイル、提案された祖先ファイル、一般的な祖先ファイルの間で 3 方向のマージを実行する戦略。この戦略では、各競合の既存のファイルの 側を選択して競合を解決します。

マージ戦略のソースコードを表示するには、「オープンソース GitHub リポジトリ」を参照してください。

ライフサイクル管理更新用のファイルの指定

再同期中、ブループリントは変更を既存のソースリポジトリにマージする方法を制御します。ただし、設計図のすべてのファイルに更新をプッシュしたくない場合があります。例えば、CSS スタイルシートなどのサンプルコードはプロジェクト固有であることが意図されています。別の戦略を指定しない場合、3 方向マージ戦略がデフォルトのオプションです。設計図では、リポジトリコンストラクト自体でマージ戦略を指定することで、所有するファイルと所有しないファイルを指定できます。ブループリントはマージ戦略を更新でき、最新の戦略は再合成中に使用できます。

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 マージ戦略ドライバーに準拠しています。

マージ戦略の記述

提供されているビルドマージ戦略の 1 つを使用することに加えて、独自の戦略を作成することもできます。戦略は、標準戦略インターフェイスに従う必要があります。existing-bundle、、proposed-bundleおよび からファイルのバージョンを取得しancestor-bundle、それらを 1 つの解決済みファイルにマージする戦略関数を記述する必要があります。例:

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