使用合併策略產生套裝軟體並指定檔案 - Amazon CodeCatalyst

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用合併策略產生套裝軟體並指定檔案

使用重新同步產生檔案

Resynthesis 可以將藍圖產生的原始程式碼與先前由相同藍圖產生的原始程式碼合併,從而允許對藍圖的變更傳播到現有專案。合併是從跨藍圖輸出服務包的resynth()函數執行。Resynthesis 首先會產生三個束,代表藍圖和專案狀態的不同層面。它可以使用yarn blueprint:resynth命令在本地手動運行,如果它們不存在,它們將創建捆綁包。手動使用包將允許您在本地模擬和測試重新同步行為。依預設,藍圖只會在下的儲存庫中執行重新同步,src/*因為只有套裝軟體的該部分位於原始檔控制之下。

  • existing-bundle-此捆綁是現有項目狀態的表示。這是由合成計算人為構建的,以提供有關它正在部署到的項目中的內容(如果有的話)的藍圖上下文。如果在本地運行 resynthesis 時在此位置已經存在某些東西,它將被重置並尊重為模擬。否則,它將被設置為的內容ancestor-bundle

  • ancestor-bundle-如果與某些先前的選項和/或版本合成藍圖輸出,則表示藍圖輸出的捆綁包。如果這是第一次將此藍圖新增至專案,則祖系不存在,因此會將其設定existing-bundle為與. 在本地,如果這個包已經存在於這個位置,它將被視為一個模擬。

  • proposed-bundle-如果使用一些新選項和/或版本合成藍圖,這是嘲笑藍圖的捆綁包。這是將由synth()函數產生的同一個包。在本機上,此套件一律會遭到覆寫。

每個套裝軟體都會在重新同步階段建立,該階段可從下的藍圖類別存取。this.context.resynthesisPhase

  • resolved-bundle-這是最後一個包,這是什麼被打包和部署到 CodeCatalyst 項目的表示。您可以檢視傳送至部署機制的檔案和差異。這是解析其他三個包之間合併的resynth()函數的輸出。

套用三向合併,方法是採取和之間的差異,ancestor-bundleproposed-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/**', ], }, ]);

可以指定多個合併策略,最後一個策略優先。未覆蓋的文件默認為 three-way-merge 類似於 Git。通過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/**', ], }, ],