Zo los je CIRCULAR_DEPENDENCY op in Salesforce-deployments

Twee of meer metadatacomponenten verwijzen naar elkaar, waardoor Salesforce geen geldige deploymentvolgorde kan bepalen.

Verschijnt tijdens: validatie van metadata-deployment, voordat er een test wordt uitgevoerd

Wat het betekent

CIRCULAR_DEPENDENCY treedt op wanneer twee componenten, meestal Apex-klassen, custom metadata-records of record types, elkaar vereisen om eerst te bestaan. De Metadata API deployt componenten in afhankelijkheidsvolgorde, en een lus betekent dat er geen geldige volgorde is die aan beide voldoet.

Apex is de meest voorkomende trigger, omdat de compiler klasseverwijzingen tijdens de deployment oplost: als de signatuur van Klasse A verwijst naar Klasse B en de signatuur van Klasse B verwijst naar Klasse A, kan geen van beide op zichzelf compileren, alleen samen in dezelfde deploymenttransactie.

Diagnose

Veelvoorkomende oorzaken

Twee Apex-klassen verwijzen naar elkaars methoden
Klasse A roept een methode van Klasse B aan, en Klasse B roept een methode van Klasse A aan, dus geen van beide kan compileren voordat de ander bestaat.
Custom metadata types verwijzen naar elkaar
Een custom metadata-record op Type A slaat een verwijzing op naar een record op Type B, en een record op Type B verwijst terug naar Type A.
Record types verwijzen naar elkaars picklistwaarden
Twee record types op gerelateerde objecten beperken elk een picklist tot waarden die worden beheerd door het record type van de ander, waardoor een lus ontstaat die de deployment niet kan oplossen.

De oplossing

  1. Deploy eerst een stub om de lus te doorbreken
    Deploy één kant van het paar met een minimale of lege implementatie, en deploy de echte logica vervolgens in een tweede stap.
  2. Combineer beide componenten in één deployment
    Bundel de onderling afhankelijke klassen of metadata in één deployment, zodat Salesforce de hele set samen oplost in plaats van ze afzonderlijk te ordenen.
    sf project deploy start --source-dir force-app/main/default/classes/ClassA.cls force-app/main/default/classes/ClassB.cls
  3. Refactor om de wederzijdse verwijzing te verwijderen
    Haal de gedeelde logica uit naar een derde klasse of interface, zodat geen van de originele componenten rechtstreeks afhankelijk is van de ander.
In de praktijk

Hoe Serpent dit voorkomt

Serpent houdt bij welke componenten een taak raakt en signaleert onderling afhankelijke componenten voordat ze over aparte taken worden verdeeld, zodat een circulair paar samen wordt gedeployed in plaats van halverwege te mislukken. Bekijk de bibliotheek met Salesforce-deploymentfouten.

No-code CI/CD-pipelinebuilder in Serpent

Preventie

Ontwerp gedeelde logica vooraf in een gemeenschappelijke basis of interface
Wanneer twee klassen elkaar moeten aanroepen, haal het gedeelde contract dan vanaf het begin naar een interface of utility-klasse in plaats van directe verwijzingen te bedraden.
Splits een wederzijds afhankelijk paar nooit over aparte taken
Houd componenten die naar elkaar verwijzen in dezelfde branch en dezelfde deploymenteenheid, zodat ze nooit onafhankelijk van elkaar worden gepromoot.
Breng kruisverwijzingen in kaart voordat je custom metadata-relaties ontwerpt
Schets de verwijzingsrichting tussen custom metadata types voordat je ze bouwt, zodat een tweerichtingsafhankelijkheid op papier wordt ontdekt en niet tijdens de deployment.
Veelgestelde vragen

CIRCULAR_DEPENDENCY, uitgelegd

Lost het opsplitsen van een deployment in kleinere change sets CIRCULAR_DEPENDENCY op?
Nee, meestal wordt het er erger van. Het opsplitsen van onderling afhankelijke componenten over aparte deployments is juist wat de lus veroorzaakt; ze samen in één deployment bundelen is de oplossing.
Kunnen drie of meer componenten een circulaire afhankelijkheid vormen, niet alleen twee?
Ja. Een lus van elke lengte, A hangt af van B, B hangt af van C, C hangt weer af van A, veroorzaakt dezelfde fout; de oplossing is nog steeds om de hele lus samen te deployen.
Lost de Salesforce CLI circulaire Apex-afhankelijkheden automatisch op?
Nee. De CLI deployt de set bestanden waar je naar verwijst als één transactie; hij herordent of stubt geen componenten voor je, dus beide kanten van het paar moeten expliciet worden opgenomen.

Start gratis. Geen creditcard, geen installatie, geen verplichting.

Binnen 15 minuten ingesteld. Geen DevOps-aanwerving nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.