ImranAkram.XTB.AutoDeployer
1.2026.10.18
dotnet add package ImranAkram.XTB.AutoDeployer --version 1.2026.10.18
NuGet\Install-Package ImranAkram.XTB.AutoDeployer -Version 1.2026.10.18
<PackageReference Include="ImranAkram.XTB.AutoDeployer" Version="1.2026.10.18" />
<PackageVersion Include="ImranAkram.XTB.AutoDeployer" Version="1.2026.10.18" />
<PackageReference Include="ImranAkram.XTB.AutoDeployer" />
paket add ImranAkram.XTB.AutoDeployer --version 1.2026.10.18
#r "nuget: ImranAkram.XTB.AutoDeployer, 1.2026.10.18"
#:package ImranAkram.XTB.AutoDeployer@1.2026.10.18
#addin nuget:?package=ImranAkram.XTB.AutoDeployer&version=1.2026.10.18
#tool nuget:?package=ImranAkram.XTB.AutoDeployer&version=1.2026.10.18
Auto Deployer Tool in XrmToolBox
Auto Deployer is an XrmToolBox plugin that watches local files and automatically deploys updates to Dataverse / Dynamics 365.
It currently supports:
- Plugin Assembly auto-update (watch a
.dll, update the plugin assembly when the file changes) - Web Resource auto-deploy (watch selected local files and update/publish matching Dataverse Web Resources)
- Plugin Package auto-update (Online only) (watch a
.nupkg, upload it to a selected Dataverse Plugin Package)
Features
✅ Plugin Assembly auto-deploy
- Watch one or more plugin assembly
.dllfiles - When the file changes, the tool updates the corresponding Plugin Assembly in Dataverse
- Logs actions and results in the tool output pane
✅ Web Resource auto-deploy
Configure:
- Root folder (local build output folder)
- Prefix (Dataverse web resource prefix, e.g.
cint_) - Patterns (file globs like
scripts\*.js) - Publish after update (on/off)
- Debounce (ms) to batch rapid rebuilds
Workflow:
- Scan local folder to discover files that match the patterns
- The tool auto-generates
CrmNameas:{prefix}/{relativePath} - The grid is not meant to be edited directly (except the Watch checkbox)
- Watch only mappings where Watch = true
- Upload updated content on change, and optionally publish
✅ Plugin Package auto-deploy (Online only)
- Watch a Dataverse Plugin Package
.nupkg - Select the target Plugin Package record from Dataverse
- On file change, the tool uploads the
.nupkgto the package file column (pluginpackage.package) - This menu/feature is not available for on-prem connections
Requirements
- XrmToolBox (latest recommended)
- A Dataverse / Dynamics 365 connection with permissions to:
- Update Plugin Assemblies (plugin assembly mode)
- Update Web Resources + Publish (web resource mode)
- (Online) Update Plugin Packages (plugin package mode)
Getting Started
1) Install / Run in XrmToolBox
- Build the project
- Copy the plugin output to your XrmToolBox Plugins folder (or use your normal XrmToolBox dev workflow)
- Start XrmToolBox and open Auto Deployer
2) Connect to an environment
The tool is connection-aware. Configuration is stored per connection.
Using Plugin Assembly Watching
- Click Add → Plugin Assembly
- Select a plugin
.dll - The tool starts watching the file
- Rebuild your project → when the
.dllchanges, Auto Deployer updates the plugin assembly - Select an item in the list to see detailed logs
Tip: Keep your build output stable (same path) so the watcher doesn’t need to be reconfigured.
Using Web Resource Watching
Click Add → Web Resources
Configure:
- Root folder
Example:C:\Git\MySolution\dist\gdpr - Prefix
Example:cint_ - Patterns (one per line)
Examples:scripts\*.js content\*.css images\*.png - Publish after update (recommended ON)
- Debounce (default 1500ms is a good start)
- Root folder
Click Scan
- Adds matching local files to the grid (without duplicates)
- Updates
CrmNamefor existing rows based on the current Prefix - Auto-generates
CrmNameas:{prefix}/{relativePath}
Set Watch = true for the rows you want actively monitored
Click Validate
- Checks local settings (duplicates, missing files)
- If connected, checks whether the
CrmNameexists in Dataverse - Highlights cells:
- Red = local error (duplicates / missing file) or not found in Dataverse
- Green = OK
Click Save
- Configuration is saved for the current connection
- Watchers are created for rows where Watch = true
How Web Resource Mapping Works
For each watched mapping:
RelativePath is the local path relative to Root folder
Example:scripts\my_script.jsCrmName is the Dataverse Web Resource name derived from Prefix
Example:cint_/scripts/my_script.js
On file change, the tool:
- Uploads the new content to that Web Resource
- Optionally publishes (if enabled)
- Logs result to the main log pane
Note: The grid columns are intentionally read-only (except Watch).
If the Prefix was wrong earlier, use Scan or Validate after correcting Prefix to rebuild names.
Using Plugin Package Watching (Online only)
- Click Add → Plugin Package (only shown for Dataverse online)
- Select a
.nupkgfile on disk - Select the target Plugin Package from the environment
- The tool starts watching the file
- Rebuild/pack → when the
.nupkgchanges, Auto Deployer uploads the new package content - Select an item in the list to see detailed logs
Project Files
Use Save... to store everything you're watching (plugin assemblies, plugin packages and web resources with
their root folder and mappings) in an .adproj file, and Open... to load it again, later or on another
connection.
- When something is already being watched, you're asked whether to keep it (the project is added) or remove it (the project replaces it)
- If a plugin package id from the project doesn't exist in the connected environment, the package is looked up by name on the first upload
- Plugin packages are skipped on on-premises connections
Configuration & Persistence
Settings are stored using the standard XrmToolBox settings mechanism:
- Saved per connection (so each environment has its own config): plugin assemblies, plugin packages and web resources
- Loaded automatically when the connection changes
- Watchers are re-created when you connect (based on saved config)
Troubleshooting
“Not connected to an environment”
Connect in XrmToolBox first. Deployment requires an active service connection.
Nothing happens when files change
- Ensure the row has Watch = true
- Check that Root folder is correct and file really exists under it
- Some build processes trigger multiple change events; try increasing Debounce
- Verify permissions to update web resources / publish / plugin assembly / plugin package
Web resources show “Not found in Dataverse”
Use Validate while connected:
- It will check existence in Dataverse and highlight missing ones
- If Prefix is wrong, fix Prefix then click Scan or Validate again
Plugin Package menu missing
Plugin Package deploy is Online only. It will be hidden for on-prem connections.
Roadmap / Ideas
- Bulk enable/disable watch flags
- Better summary view in MainControl (active watchers / config overview)
Contributing
PRs and issues are welcome.
If you contribute:
- Keep changes backward compatible where possible
- Prefer small PRs focused on a single improvement
- Include short notes in the PR description on how to test
Building and testing
- Clone with submodules (
git clone --recursive, orgit submodule update --initafterwards) - Build
XrmToolBox.AutoDeployer.sln. A Debug build puts the plugin inbin\Debug\Plugins, next to anXrmToolBox.exeyou can start for debugging Tests\XrmToolBox.AutoDeployer.Testshas unit tests, which CI runs on every pull request, and integration tests against a real Dataverse environment, which only run locally once you've set up a connection string, publisher and prefix inTests\testbench.local.json- How to set up the test environment and those settings, run the tests, and the manual test plan: Tests/TestBench/README.md
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net48 is compatible. net481 was computed. |
-
- XrmToolBox (>= 1.2025.7.71)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2026.10.18 | 171 | 10/26/2026 |
| 1.2026.2.1 | 783 | 2/4/2026 |
| 1.2026.1.5 | 242 | 1/12/2026 |
| 1.2026.1.3 | 164 | 1/9/2026 |
New
- Project files (#19, thanks Jonas Rapp): Save... writes the watched plugin assemblies, plugin packages and web resources (with their root folder and mappings) to an .adproj file. Open... loads it again, later or on another connection, and asks whether to keep or replace the current watchers.
- Watched plugin assemblies are remembered per connection and come back when you reconnect, like plugin packages and web resources already did.
- Plugin packages: when the saved package id doesn't exist in the connected environment, the package is looked up by name and the upload is retried.
Fixes
- Replacing the watchers when opening a project now really stops the old ones, instead of leaving them deploying in the background.
- Plugin packages in a project are skipped, with a message, on environments that don't support them (on-premises). Opening a project right after connecting no longer skips them while that check is still running.
- Open... and adding a plugin assembly need a connection first.
- Removing a plugin assembly that wasn't found in Dataverse no longer throws an error, and its file watcher is released.
Behind the scenes
- Built, tested and released with GitHub Actions (#20); AppVeyor config removed.
- Unit tests, plus local integration tests against a Dataverse test environment.