本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用合併策略來產生套件和指定檔案
您可以使用合併策略來產生具有重新合成的套件,並指定檔案以進行自訂藍圖的生命週期管理更新。透過利用重新合成和合併策略,您可以管理更新,並控制部署期間更新的檔案。您也可以撰寫自己的策略,以控制變更如何合併到現有 CodeCatalyst 專案中。
使用重新合成產生檔案
重新合成可以將藍圖產生的原始程式碼與先前由相同藍圖產生的原始程式碼合併,允許將藍圖的變更傳播至現有專案。合併是從 resynth()
函數跨藍圖輸出套件執行。重新合成會先產生三個套件,代表藍圖和專案狀態的不同層面。它可以使用 yarn blueprint:resynth
命令在本機手動執行,如果套件不存在,則會建立套件。手動使用套件可讓您在本機模擬和測試重新合成行為。根據預設,藍圖只會在 下的儲存庫上執行重新合成,src/*
因為通常只有該部分的套件受到來源控制。如需詳細資訊,請參閱樹脂同步。
-
existing-bundle
- 此套件是現有專案狀態的表示。這是由合成運算人工建構的,以提供有關正在部署的專案中內容的藍圖內容 (如果有的話)。如果在本機執行重新合成時,此位置已存在某些內容,則會將其重設並視為模擬。否則,它會設定為 的內容ancestor-bundle
。 -
ancestor-bundle
- 這是套件,如果與一些先前的選項和/或版本合成,則表示藍圖輸出。如果這是第一次將此藍圖新增至專案,則祖先不存在,因此會設定為與 相同的內容existing-bundle
。在本地區,如果此套件已存在於此位置,則會將其視為模擬。 -
proposed-bundle
- 如果藍圖是與一些新選項和/或版本合成,這是模擬藍圖的套件。這是由synth()
函數產生的相同套件。在本機,此套件一律會覆寫。
每個套件都是在重新合成階段期間建立,可以從 下的藍圖類別存取this.context.resynthesisPhase
。
resolved-bundle
- 這是最終套件,表示要封裝和部署到 CodeCatalyst 專案的內容。您可以檢視哪些檔案和 diffs 會傳送至部署機制。這是解析其他三個套件之間合併的resynth()
函數輸出。
三向合併的套用方式是將 ancestor-bundle
與 之間的差異,proposed-bundle
並將其新增至 existing-bundle
以產生 resolved-bundle
。所有合併策略都會將檔案解析為 resolved-bundle
。重新合成會在 期間透過藍圖的合併策略解決這些套件的觸及,resynth()
並從結果產生已解析的套件。
使用合併策略
您可以使用藍圖程式庫所取代的合併策略。這些策略提供解決使用重新合成產生檔案一節中提及之檔案輸出和衝突的方法。
-
alwaysUpdate
- 一律解析為建議檔案的策略。 -
neverUpdate
- 一律解析為現有檔案的策略。 -
onlyAdd
- 當現有檔案不存在時,解析為建議檔案的策略。否則, 會解析為現有檔案。 -
threeWayMerge
- 在現有、建議和常見祖檔案之間執行三向合併的策略。如果檔案無法完全合併,解析的檔案可能包含衝突標記。提供檔案的內容必須編碼為 UTF-8,策略才能產生有意義的輸出。策略會嘗試偵測輸入檔案是否為二進位檔案。如果策略偵測到二進位檔案中的合併衝突,則會一律傳回建議的檔案。 -
preferProposed
- 在現有、提議和常見祖先檔案之間執行三向合併的策略。此策略透過選取每個衝突的建議檔案端來解決衝突。 -
preferExisting
- 在現有、建議和常見祖檔案之間執行三向合併的策略。此策略透過選取每個衝突的現有檔案端來解決衝突。
若要檢視合併策略的原始程式碼,請參閱開放原始碼 GitHub 儲存庫
指定用於生命週期管理更新的檔案
在重新合成期間,藍圖會控制變更如何合併到現有的來源儲存庫中。不過,您可能不想將更新推送至藍圖中的每個單一檔案。例如,CSS樣式表之類的範例程式碼旨在針對特定專案。如果您未指定其他策略,則三向合併策略是預設選項。Blueprints 可以透過在儲存庫建構體上指定合併策略,來指定他們擁有哪些檔案,以及哪些檔案不是。Blueprints 可以更新合併策略,而且可以在重新合成期間使用最新的策略。
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-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/**', ], }, ],