DataverseDrift 1.2.2
dotnet tool install --global DataverseDrift --version 1.2.2
dotnet new tool-manifest
dotnet tool install --local DataverseDrift --version 1.2.2
#tool dotnet:?package=DataverseDrift&version=1.2.2
nuke :add-package DataverseDrift --version 1.2.2
DataverseDrift
Several people are editing the same Dataverse environment, and nobody can say what moved. Forms, views, entities and flows all change in place, in a shared DEV or TEST box, with no commit, no author, and no record.
dvdrift answers it. Point it at two snapshots and it reports what changed, who
changed it, and what got left running - like the cloud flow somebody activated to
try something and never switched off. No AI: identical inputs always produce
byte-identical output.
Raw XML diffs can't do this. Dataverse re-serializes solution XML on every export,
drowning real changes in thousands of lines of noise - and a diff only sees what
changed, so the flow quietly running in TEST since March never appears in one.
dvdrift canonicalizes the noise away, classifies what's left, and joins
attribution and flow state from the Dataverse Web API.
Install
dotnet tool install --global DataverseDrift
Runs on .NET 8 or .NET 10. The diff works fully offline; only the attribution join needs API access.
Usage
# Two snapshots in, one report out
dvdrift baseline.zip current.zip
# JSON to a file, gate the pipeline on any change
dvdrift snapshots/monday snapshots/tuesday --format json --out report.json --fail-on-change
# Join attribution and flow state from Dataverse
dvdrift baseline current --url https://org-test.crm4.dynamics.com --tenant-id $TENANT --client-id $APP --client-secret $SECRET
Snapshots can be a solution .zip, a container zip/folder of several, a raw
extract, or a pac-unpacked folder. Output is Markdown (default) or JSON.
- CLI reference - all options, auth env vars, exit codes
- What it detects - component coverage, example output, caveats
- Configuration - per-repo
dvdrift.jsonoverrides
CI/CD
You produce the two snapshots, dvdrift compares them - storage- and CI-agnostic.
Both integrations below keep credentials out of command lines and leave gating to
you (off by default).
GitHub Actions (reference):
- uses: jakobhoeg/dvdrift@v1
id: diff
with:
baseline: baseline/
current: current.zip
url: ${{ vars.DEV_URL }}
client-id: ${{ secrets.DATAVERSE_APP_ID }}
client-secret: ${{ secrets.DATAVERSE_CLIENT_SECRET }}
tenant-id: ${{ secrets.TENANT_ID }}
# report lands in the job summary; steps.diff.outputs.changed is 'true' / 'false'
Azure Pipelines (reference):
- template: pipelines/templates/dvdrift-steps.yml@dvdrift
parameters:
baseline: $(Pipeline.Workspace)/baseline
current: $(Build.ArtifactStagingDirectory)/current.zip
url: $(DataverseUrl)
# report goes to the build summary and an artifact; $(dvdrift.changed) is set
End-to-end recipes: bring your own export · GitHub Actions + pac · Azure Pipelines + Build Tools · scheduled drift check
Roadmap
- v1.x - field-level structural form/entity diffing; plugin step enabled/disabled flags; entity/attribute metadata attribution
License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.