Removes this app's dynamicPackages entries whose PackageName is NOT in the supplied manifest —
i.e. packages a NEW version of the app no longer ships.
The Add* functions are add-only and idempotent, which is correct for install but leaves upgrade
converging on the union of every version ever installed: a dropped startupExport package keeps
its server entry, so the loader tries to import a package that may no longer build. Pair this
with AddServerDynamicPackages / AddClientDynamicPackages on the upgrade path to
make the config match the new manifest exactly.
Surviving entries are left byte-identical rather than removed and re-added, so a disabled app's
Enabled: false state is preserved. Server and client keep-sets are computed per array, so a
server-only package is not pruned from server just because it is absent from client.
Removes this app's
dynamicPackagesentries whose PackageName is NOT in the supplied manifest — i.e. packages a NEW version of the app no longer ships.The Add* functions are add-only and idempotent, which is correct for install but leaves upgrade converging on the union of every version ever installed: a dropped
startupExportpackage keeps its server entry, so the loader tries to import a package that may no longer build. Pair this with AddServerDynamicPackages / AddClientDynamicPackages on the upgrade path to make the config match the new manifest exactly.Surviving entries are left byte-identical rather than removed and re-added, so a disabled app's
Enabled: falsestate is preserved. Server and client keep-sets are computed per array, so a server-only package is not pruned fromserverjust because it is absent fromclient.