
Andrew Hanna

Andrew Hanna

Kort antwoord: cross-package dependency resolution is hoe Salesforce
bepaalt welke packages al aanwezig moeten zijn, en in welke versies, voordat een ander
package kan installeren of upgraden. Je legt dat vast in de array
dependencies in sfdx-project.json, in installatievolgorde.
Klopt de volgorde en kloppen de minimumversies, dan zijn upgrades bij subscribers
saai. Klopt het niet, dan belandt een org op een versie waar hij niet meer vanaf komt.
Er is een afhankelijkheid zodra metadata in het ene package verwijst naar metadata in het andere: een Flow op een managed object, een Apex-klasse die een baseklasse uitbreidt, een field set op andermans veld. Het praktische gevolg is een voorwaarde vooraf. Het package waarnaar verwezen wordt moet eerst geinstalleerd zijn, in een versie die minstens zo nieuw is als die waartegen je bouwde, anders faalt de installatie.
In het packagedirectory-item van sfdx-project.json, in een van twee
vormen:
{ "package": "[email protected]" }
{ "package": "MyPackage", "versionNumber": "1.0.0.RELEASED" }
Drie regels tellen zwaarder dan de syntax.
"calculateTransitiveDependencies": true en je declareert
alleen directe afhankelijkheden, terwijl de indirecte worden berekend. Laat je dat
uit, dan moet je elk niveau zelf blijven opsommen.
Dit beperkt de architectuur, dus controleer het voordat je die tekent.
Een 1GP-basepackage onder een 2GP-uitbreiding is het meest voorkomende afhankelijkheidsontwerp dat laat weer ontrafeld moet worden, en op dat moment is het duur. Lees de ondersteunde combinaties voor de eerste build, niet erna.
RELEASED volgt je laatst uitgebrachte versie, wat
handig is tijdens ontwikkeling en een verrassing in een releasebuild.
SubscriberPackageVersion vertelt je wat er in die org staat en in welke
versie, wat beter is dan de pagina Installed Packages lezen en hopen.
Kun je die volgorde voor je eigen product niet uit je hoofd opnoemen, dan kan je supportteam dat ook niet op het moment dat een klant vastzit.
De volgorde die werkt als een basepackage verandert: breng de nieuwe baseversie uit, breng subscribers erop met een recommended version of een push upgrade, en breng dan pas het afhankelijke package uit dat die versie vereist. Draai je die twee om, dan krijg je een upgrade die faalt op een voorwaarde in een org die je niet ziet en van jouw kant niet kunt repareren.
sfdx-project.json en laat de
build falen op een cyclus.
Serpent doet cross-package dependency resolution, 1GP-, 2GP- en managed-packageworkflows en versiebeheer over subscriber-orgs op elk plan, inclusief het gratis plan. Meer packaging-playbooks vind je in onze SF Guides-bibliotheek.
Mag een managed 2GP-package afhangen van een managed 1GP-package?
Standaard niet. Salesforce blokkeert die combinatie, en een individuele uitzondering vraag je aan via een case bij Salesforce Partner Support.
Moet ik transitieve afhankelijkheden opsommen?
Alleen als je dat wilt. Met
"calculateTransitiveDependencies": true declareer je directe
afhankelijkheden en worden de indirecte berekend. Zonder dat moet elk niveau met de
hand in de lijst.
Wat gebeurt er als twee packages van elkaar afhangen?
Niets goeds, want circulaire afhankelijkheden worden niet ondersteund. Haal de gedeelde metadata uit elkaar naar een lager package waar beide van afhangen.
Welk package upgrade ik als eerste in een subscriber-org?
Het package dat het diepst in de graaf zit. Afhankelijkheden gaan voor de packages die ze nodig hebben, in dezelfde volgorde als bij de installatie.
Waarom faalt de upgrade van mijn klant met een dependency-fout?
Meestal een te lage minimumversie. Het geinstalleerde basepackage is ouder dan wat je nieuwe release vereist, dus upgrade eerst het basepackage en probeer opnieuw.
Vrijblijvend.