병합 전략을 사용하여 번들 생성 및 파일 지정 - 아마존 CodeCatalyst

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

병합 전략을 사용하여 번들 생성 및 파일 지정

재합성을 통한 파일 생성

재합성은 블루프린트에서 생성된 소스 코드를 동일한 블루프린트에서 이전에 생성한 소스 코드와 병합하여 블루프린트에 대한 변경 사항을 기존 프로젝트에 전파할 수 있습니다. 함수에서 블루프린트 출력 번들 전반에서 병합이 resynth() 실행됩니다. 재합성은 먼저 블루프린트와 프로젝트 상태의 다양한 측면을 나타내는 세 개의 번들을 생성합니다. yarn blueprint:resynth명령을 사용하여 로컬에서 수동으로 실행할 수 있으며, 번들이 아직 없는 경우 번들이 생성됩니다. 번들을 수동으로 사용하여 작업하면 로컬에서 재합성 동작을 모의하고 테스트할 수 있습니다. 기본적으로 블루프린트는 저장소 전체에서만 재합성을 실행합니다. 보통 번들 중 일부만 소스 컨트롤 하에 src/* 있기 때문입니다.

  • existing-bundle- 이 번들은 기존 프로젝트 상태를 나타냅니다. 이는 합성 컴퓨팅을 통해 인위적으로 구성한 것으로, 배포하려는 프로젝트의 내용 (있는 경우) 에 대한 청사진 컨텍스트를 제공합니다. 로컬에서 재합성을 실행할 때 이 위치에 무언가가 이미 존재한다면, 재설정되고 모의 객체로 간주될 것입니다. 그렇지 않으면 의 내용으로 설정됩니다. ancestor-bundle

  • ancestor-bundle- 이전 옵션 및/또는 버전과 합성된 경우 블루프린트 출력을 나타내는 번들입니다. 이 블루프린트가 프로젝트에 처음 추가되는 것이라면, 상위 블루프린트는 존재하지 않으므로 블루프린트와 동일한 내용으로 설정됩니다. existing-bundle 로컬에서 이 번들이 이미 이 위치에 있으면 모의 제품으로 간주합니다.

  • proposed-bundle- 이 번들은 블루프린트가 몇 가지 새로운 옵션 및/또는 버전으로 합성된 경우 블루프린트를 모방하는 번들입니다. 이 번들은 함수에서 생성되는 번들과 동일합니다. synth() 로컬에서는 이 번들이 항상 오버라이드됩니다.

각 번들은 재합성 단계에서 생성되며, 아래의 블루프린트 클래스에서 접근할 수 있습니다. this.context.resynthesisPhase

  • resolved-bundle- 이것은 최종 번들로, 무엇이 패키징되어 프로젝트에 배포되는지를 표현한 CodeCatalyst 것입니다. 배포 메커니즘으로 전송되는 파일 및 diff를 볼 수 있습니다. 이것은 다른 세 번들 간의 병합을 해결하는 resynth() 함수의 출력입니다.

3방향 병합은 ancestor-bundleproposed-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/**', ], }, ]);

병합 전략을 여러 개 지정할 수 있으며 마지막 전략이 우선합니다. 발견되지 않은 파일은 기본적으로 three-way-merge Git과 비슷합니다. MergeStrategies구문을 통해 제공되는 여러 병합 전략이 있지만 직접 작성할 수도 있습니다. 제공된 전략은 git merge 전략 드라이버를 준수합니다.

병합 전략 작성

제공된 빌드 병합 전략 중 하나를 사용하는 것 외에도 자신만의 전략을 작성할 수도 있습니다. 전략은 표준 전략 인터페이스를 준수해야 합니다. existing-bundle,proposed-bundle, 에서 파일 버전을 가져와서 하나의 확인된 파일로 병합하는 전략 함수를 작성해야 합니다. ancestor-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/**', ], }, ],