So beheben Sie CIRCULAR_DEPENDENCY in Salesforce-Deployments

Zwei oder mehr Metadatenkomponenten verweisen aufeinander, sodass Salesforce keine gültige Deployment-Reihenfolge ermitteln kann.

Tritt auf bei: Metadata-Deployment-Validierung, bevor ein Test ausgeführt wird

Was das bedeutet

CIRCULAR_DEPENDENCY tritt auf, wenn zwei Komponenten, meist Apex-Klassen, benutzerdefinierte Metadatensätze oder Record Types, jeweils erfordern, dass die andere zuerst existiert. Die Metadata API deployt Komponenten in Abhängigkeitsreihenfolge, und ein Zyklus bedeutet, dass es keine gültige Reihenfolge gibt, die beide erfüllt.

Apex ist der häufigste Auslöser, weil der Compiler Klassenverweise zur Deployment-Zeit auflöst: Wenn die Signatur von Klasse A auf Klasse B verweist und die Signatur von Klasse B auf Klasse A, kann keine von beiden allein zuerst kompiliert werden, sondern nur gemeinsam in derselben Deployment-Transaktion.

Diagnose

Häufige Ursachen

Zwei Apex-Klassen verweisen auf die Methoden der jeweils anderen
Klasse A ruft eine Methode von Klasse B auf, und Klasse B ruft eine Methode von Klasse A auf, sodass keine von beiden kompiliert werden kann, bevor die andere existiert.
Benutzerdefinierte Metadatentypen verweisen aufeinander
Ein benutzerdefinierter Metadatensatz vom Typ A speichert einen Verweis auf einen Datensatz vom Typ B, und ein Datensatz vom Typ B verweist zurück auf Typ A.
Record Types verweisen auf die Picklist-Werte der jeweils anderen
Zwei Record Types auf verknüpften Objekten beschränken jeweils eine Picklist auf Werte, die vom Record Type des anderen kontrolliert werden, wodurch eine Schleife entsteht, die das Deployment nicht auflösen kann.

Die Lösung

  1. Deployen Sie zuerst einen Stub, um den Zyklus zu durchbrechen
    Deployen Sie eine Seite des Paares mit einer minimalen oder leeren Implementierung und deployen Sie die eigentliche Logik anschließend in einem zweiten Durchgang.
  2. Kombinieren Sie beide Komponenten in einem einzigen Deployment
    Bündeln Sie die voneinander abhängigen Klassen oder Metadaten in einem Deployment, sodass Salesforce die gesamte Menge zusammen auflöst, statt sie einzeln zu ordnen.
    sf project deploy start --source-dir force-app/main/default/classes/ClassA.cls force-app/main/default/classes/ClassB.cls
  3. Refaktorieren, um den gegenseitigen Verweis zu entfernen
    Extrahieren Sie die gemeinsame Logik in eine dritte Klasse oder Schnittstelle, sodass keine der ursprünglichen Komponenten direkt von der anderen abhängt.
In der Praxis

Wie Serpent das verhindert

Serpent verfolgt, welche Komponenten eine Aufgabe betrifft, und markiert voneinander abhängige Komponenten, bevor sie auf separate Aufgaben aufgeteilt werden, sodass ein zirkuläres Paar gemeinsam deployt wird, statt auf halbem Weg zu scheitern. Siehe die Bibliothek der Salesforce-Deployment-Fehler.

No-Code-CI/CD-Pipeline-Builder in Serpent

Prävention

Gemeinsame Logik von Anfang an in eine gemeinsame Basis oder Schnittstelle auslagern
Wenn zwei Klassen einander aufrufen müssen, extrahieren Sie den gemeinsamen Vertrag von Anfang an in eine Schnittstelle oder Utility-Klasse, statt direkte Verweise zu verdrahten.
Teilen Sie ein gegenseitig abhängiges Paar niemals auf separate Aufgaben auf
Halten Sie Komponenten, die aufeinander verweisen, im selben Branch und derselben Deployment-Einheit, damit sie niemals unabhängig voneinander befördert werden.
Kreuzverweise vor dem Entwurf benutzerdefinierter Metadatenbeziehungen kartieren
Skizzieren Sie die Verweisrichtung zwischen benutzerdefinierten Metadatentypen, bevor Sie sie erstellen, damit eine wechselseitige Abhängigkeit auf dem Papier erkannt wird, nicht zur Deployment-Zeit.
Häufige Fragen

CIRCULAR_DEPENDENCY, erklärt

Behebt das Aufteilen eines Deployments in kleinere Change Sets CIRCULAR_DEPENDENCY?
Nein, das macht es meist schlimmer. Das Aufteilen voneinander abhängiger Komponenten auf separate Deployments ist überhaupt erst die Ursache des Zyklus; sie in einem Deployment zu bündeln ist die Lösung.
Können drei oder mehr Komponenten eine zirkuläre Abhängigkeit bilden, nicht nur zwei?
Ja. Ein Zyklus beliebiger Länge, A hängt von B ab, B hängt von C ab, C hängt wieder von A ab, löst denselben Fehler aus; die Lösung besteht weiterhin darin, den gesamten Zyklus gemeinsam zu deployen.
Löst die Salesforce CLI zirkuläre Apex-Abhängigkeiten automatisch auf?
Nein. Die CLI deployt die Dateimenge, auf die Sie sie verweisen, als eine Transaktion; sie ordnet Komponenten nicht neu an oder erstellt Stubs für Sie, daher müssen beide Seiten des Paares explizit einbezogen werden.

Kostenlos starten. Keine Kreditkarte, keine Installation, keine Verpflichtung.

In unter 15 Minuten eingerichtet. Keine DevOps-Einstellung nötig.

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.