Verwenden von Zusammenführungsstrategien zum Generieren von Bundles und Spezifizieren von Dateien - Amazon CodeCatalyst

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden von Zusammenführungsstrategien zum Generieren von Bundles und Spezifizieren von Dateien

Generieren von Dateien mit Resynthese

Bei der Resynthese kann der von einem Blueprint erzeugte Quellcode mit Quellcode zusammengeführt werden, der zuvor mit demselben Blueprint generiert wurde, sodass Änderungen an einem Blueprint auf bestehende Projekte übertragen werden können. Zusammenführungen werden von der Funktion aus über alle Blueprint-Ausgabepakete hinweg ausgeführt. resynth() Die Resynthese generiert zunächst drei Bündel, die verschiedene Aspekte des Blueprints und des Projektstatus repräsentieren. Es kann manuell lokal mit dem yarn blueprint:resynth Befehl ausgeführt werden, der die Bundles erstellt, falls sie noch nicht existieren. Wenn Sie manuell mit den Bundles arbeiten, können Sie das Resyntheseverhalten lokal simulieren und testen. Standardmäßig führen Blueprints die Resynthese nur für die Repositorys unter aus, src/* da normalerweise nur dieser Teil des Bundles der Quellcodeverwaltung unterliegt.

  • existing-bundle— Dieses Paket ist eine Darstellung des aktuellen Projektstatus. Dies wird durch die Synthese-Berechnung künstlich konstruiert, um dem Blueprint-Kontext darüber zu geben, was in dem Projekt enthalten ist, in dem es implementiert wird (wenn überhaupt). Wenn beim lokalen Ausführen der Resynthese an dieser Stelle bereits etwas existiert, wird es zurückgesetzt und als Mock betrachtet. Andernfalls wird es auf den Inhalt von gesetzt. ancestor-bundle

  • ancestor-bundle- Dies ist das Paket, das die Blueprint-Ausgabe darstellt, wenn sie mit einigen früheren Optionen und/oder Versionen synthetisiert wurde. Wenn dies das erste Mal ist, dass dieser Blueprint zu einem Projekt hinzugefügt wird, dann ist der Vorgänger nicht vorhanden, also hat er denselben Inhalt wie der. existing-bundle Wenn dieses Paket lokal bereits an diesem Speicherort existiert, wird es als Nachahmer betrachtet.

  • proposed-bundle- Dies ist das Bundle, das sich über den Blueprint lustig macht, wenn er mit neuen Optionen und/oder Versionen synthetisiert wurde. Dies ist das gleiche Paket, das von der Funktion erzeugt werden würde. synth() Lokal wird dieses Bundle immer außer Kraft gesetzt.

Jedes Bundle wird während einer Resynthese-Phase erstellt, auf die über die Blueprint-Klasse unter zugegriffen werden kann. this.context.resynthesisPhase

  • resolved-bundle- Dies ist das endgültige Paket, das darstellt, was verpackt und für ein CodeCatalyst Projekt bereitgestellt wird. Sie können sehen, welche Dateien und Diffs an die Bereitstellungsmechanismen gesendet werden. Dies ist die Ausgabe der resynth() Funktion, die Zusammenführungen zwischen den drei anderen Bundles auflöst.

Die dreiseitige Zusammenführung wird angewendet, indem die Differenz zwischen und genommen ancestor-bundle proposed-bundle und zu dem addiert wird, um das existing-bundle zu generieren. resolved-bundle Alle Zusammenführungsstrategien lösen Dateien in die resolved-bundle auf. Bei der Resynthese werden alle Bündel mithilfe der Zusammenführungsstrategien des Blueprints währenddessen aufgelöst resynth() und aus dem Ergebnis das aufgelöste Bündel erstellt.

Verwendung von Merge-Strategien

Sie können eine Merge-Strategie verwenden, die von der Blueprints-Bibliothek bereitgestellt wird. Diese Strategien bieten Möglichkeiten, Dateiausgaben und Konflikte für die im Abschnitt genannten Dateien zu lösen. Generieren von Dateien mit Resynthese

  • alwaysUpdate- Eine Strategie, bei der immer die vorgeschlagene Datei gefunden wird.

  • neverUpdate- Eine Strategie, bei der immer auf die bestehende Datei zurückgegriffen wird.

  • onlyAdd- Eine Strategie, bei der die vorgeschlagene Datei verwendet wird, wenn eine bestehende Datei noch nicht existiert. Andernfalls wird die Datei in der vorhandenen Datei aufgelöst.

  • threeWayMerge- Eine Strategie, bei der die vorhandenen, vorgeschlagenen und gemeinsamen Vorgängerdateien in drei Richtungen zusammengeführt werden. Die gelöste Datei kann Konfliktmarkierungen enthalten, wenn die Dateien nicht sauber zusammengeführt werden können. Der Inhalt der bereitgestellten Dateien muss UTF-8-kodiert sein, damit die Strategie eine aussagekräftige Ausgabe liefert. Die Strategie versucht zu erkennen, ob die Eingabedateien binär sind. Wenn die Strategie einen Zusammenführungskonflikt in einer Binärdatei erkennt, gibt sie immer die vorgeschlagene Datei zurück.

  • preferProposed- Eine Strategie, die eine dreiseitige Zusammenführung zwischen den vorhandenen, vorgeschlagenen und gemeinsamen Vorgängerdateien durchführt. Bei dieser Strategie werden Konflikte gelöst, indem für jeden Konflikt die Seite der vorgeschlagenen Datei ausgewählt wird.

  • preferExisting- Eine Strategie, bei der die vorhandenen, vorgeschlagenen und gemeinsamen Vorgängerdateien in drei Richtungen zusammengeführt werden. Bei dieser Strategie werden Konflikte gelöst, indem bei jedem Konflikt die Seite der vorhandenen Datei ausgewählt wird.

Den Quellcode der Merge-Strategien finden Sie im Open-Source-Repository GitHub .

Angeben von Dateien für Lifecycle Management-Updates

Bei der Resynthese steuern Blueprints, wie Änderungen in ein vorhandenes Quell-Repository zusammengeführt werden. Möglicherweise möchten Sie jedoch nicht für jede einzelne Datei in Ihrem Blueprint Aktualisierungen per Push bereitstellen. Beispielcode wie CSS-Stylesheets sollen beispielsweise projektspezifisch sein. Die Drei-Wege-Zusammenführungsstrategie ist die Standardoption, wenn Sie keine andere Strategie angeben. Blueprints können angeben, welche Dateien sie besitzen und welche nicht, indem sie Zusammenführungsstrategien im Repository-Konstrukt selbst angeben. Blueprints können ihre Zusammenführungsstrategien aktualisieren, und bei der Resynthese können die neuesten Strategien verwendet werden.

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

Es können mehrere Zusammenführungsstrategien angegeben werden, wobei die letzte Strategie Vorrang hat. Unentdeckte Dateien sind standardmäßig three-way-merge ähnlich wie Git. Das MergeStrategies Konstrukt bietet mehrere Strategien zum Zusammenführen, aber Sie können auch Ihre eigenen Strategien schreiben. Die bereitgestellten Strategien entsprechen dem Git-Merge-Strategietreiber.

Merge-Strategien schreiben

Sie können nicht nur eine der bereitgestellten Build-Merge-Strategien verwenden, sondern auch Ihre eigenen Strategien schreiben. Strategien müssen einer standardmäßigen Strategieschnittstelle entsprechen. Sie müssen eine Strategiefunktion schreiben, die Versionen einer Datei aus dem existing-bundle proposed-bundleancestor-bundle, und übernimmt und sie zu einer einzigen aufgelösten Datei zusammenführt. Beispielsweise:

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;

Wenn die Dateien nicht existieren (undefiniert sind), dann ist dieser Dateipfad in diesem bestimmten Speicherortpaket nicht vorhanden.

Beispiel:

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