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

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

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

マージ戦略を使用して、再合成を含むバンドルを生成し、カスタム設計図のライフサイクル管理更新用のファイルを指定できます。リサイテンシスとマージ戦略を活用することで、更新を管理し、デプロイ中に更新されるファイルを制御できます。また、変更を既存の 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/**', ], }, ],