[object Object]

A managed solution import fails at 2 AM with “Solution dependencies are not satisfied.” You stare at a list of 47 missing components and realize you have no idea how they relate. This is dependency hell, and it is preventable.

How dependencies form

Every reference between components creates a dependency edge. A form references columns, a view references columns, a plugin step references a message, a workflow references columns and tables. The Dataverse dependency graph is dense; a typical 100-table solution has thousands of edges.

Three classes of dependency cause most failures:

  1. Cross-solution dependencies (Solution A references a column owned by Solution B)
  2. Internal cycles (Solution A patch references a component the patch itself created in a prior patch)
  3. Ghost references (a deleted component still referenced by a saved query or plugin metadata)

See the graph before shipping

Use the Solution Checker and the dependency report. The PowerApps CLI exposes both:

pac solution check --path solution.zip
pac solution check-dependencies --path solution.zip

Pipe the JSON output into a graph database (Neo4j, or even a CSV imported into Excel with Power Query) and visualize. Cycles jump out instantly. Cross-solution references reveal who really owns what.

The single-publisher principle

The cleanest fix to cross-solution chaos is to consolidate publishers. One owner per logical domain, one solution per publisher per environment. When two teams need to share a column, the upstream team owns it and the downstream team takes a managed dependency.

Trying to share unmanaged components across teams is the root cause of most cross-solution dependency failures. It feels collaborative; it is technical debt with a long fuse.

Fix ghost references

Ghosts come from components that were deleted in dev but whose references survived in metadata. Most common: a column referenced inside a saved query or workflow JSON that was not refreshed. Symptom: import fails citing a missing column with a familiar name.

Resolution: in the source environment, open every saved query and workflow against the affected table, save them again, and re-export. Dataverse re-serializes the JSON and drops the dead reference.

For plugin steps, use the Plugin Registration Tool to inspect step images and remove references to deleted columns.

Break cycles with extraction

If Solution A references B and B references A, you have a cycle. Extract the shared components into a third solution C that both depend on. This is more work upfront, but cycles cause non-deterministic import failures that waste days.

Pipeline gates

Add a pipeline step that fails the build if pac solution check-dependencies returns any cross-solution references not on an approved allow-list. Engineers learn to ask before adding a new cross-solution edge.

Document the dependency contract

For every solution, maintain a DEPENDENCIES.md listing what it requires, what it provides, and the approved consumers. Solutions without this document accumulate dependencies invisibly.

What to do this week: run check-dependencies on your top three managed solutions, build the graph, and identify every cross-solution edge. Each one needs a documented owner or a refactor ticket.

[object Object]
Share