TALXIS.DevKit.Build.Dataverse.Solution
1.11.1
Prefix Reserved
dotnet add package TALXIS.DevKit.Build.Dataverse.Solution --version 1.11.1
NuGet\Install-Package TALXIS.DevKit.Build.Dataverse.Solution -Version 1.11.1
<PackageReference Include="TALXIS.DevKit.Build.Dataverse.Solution" Version="1.11.1"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="TALXIS.DevKit.Build.Dataverse.Solution" Version="1.11.1" />
<PackageReference Include="TALXIS.DevKit.Build.Dataverse.Solution"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add TALXIS.DevKit.Build.Dataverse.Solution --version 1.11.1
#r "nuget: TALXIS.DevKit.Build.Dataverse.Solution, 1.11.1"
#:package TALXIS.DevKit.Build.Dataverse.Solution@1.11.1
#addin nuget:?package=TALXIS.DevKit.Build.Dataverse.Solution&version=1.11.1
#tool nuget:?package=TALXIS.DevKit.Build.Dataverse.Solution&version=1.11.1
TALXIS.DevKit.Build.Dataverse.Solution
MSBuild integration for building complete Dataverse solutions. Orchestrates the entire solution build pipeline: discovers and builds referenced Plugin, WorkflowActivity, ScriptLibrary, CodeApp, and PCF projects; patches solution XML with version, publisher, and managed state; supports manual invocation of schema validation targets for solution metadata against XSD/JSON schemas; runs the shared tasks package's SolutionPackagerLib-based packager to produce a .zip file; and supports dotnet pack to generate a NuGet package containing the solution zip.
Installation
<PackageReference Include="TALXIS.DevKit.Build.Dataverse.Solution" Version="0.0.0.1" PrivateAssets="All" />
Or use the SDK approach:
<Project Sdk="TALXIS.DevKit.Build.Sdk/0.0.0.1">
<PropertyGroup>
<ProjectType>Solution</ProjectType>
</PropertyGroup>
</Project>
How It Works
The package sets ProjectType to Solution and imports Microsoft.PowerApps.MSBuild.Solution targets. The build pipeline executes in the following order:
1. Component discovery
ProbePluginLibraries, ProbeScriptLibraries, ProbeCodeApps, and ProbeWorkflowActivityLibraries call GetProjectType on all ProjectReference items to classify them by component type. ScriptLibrary and CodeApp references are removed from @(ProjectReference) after discovery so the standard .NET ResolveProjectReferences pipeline does not build them a second time -- they are built explicitly in the next step.
2. Component builds
BuildPluginLibraries, BuildScriptLibraries, BuildCodeApps, and BuildWorkflowActivityLibraries compile each referenced component project before CopyCdsSolutionContent.
3. Component metadata generation
- Plugin assemblies --
EnsurePluginAssemblyDataXmlgenerates.data.xmlfiles underPluginAssemblies/. - Plugin steps --
EnsureSdkMessageProcessingStepXml(right afterEnsurePluginAssemblyDataXml) writesSdkMessageProcessingSteps/{id}.xmland Type 92 root components into the solution source from[PluginStep]/[PluginStepImage]attributes on plugin classes, so the steps are committed like the assembly.data.xml. It reads the attributes from the built assembly's metadata by name and takes the plugin type ids from the committedPluginAssemblies/*.data.xml, which is whyGeneratePluginAssemblymust stay enabled. Files are only rewritten when their content changes.- Step identity. A step id is derived from assembly, plugin type, message, primary entity and stage, and an image id from its step, image type and alias. Changing any of those is a different step; renaming a type or moving it to another namespace too. Other settings (
Name,Rank,Mode,FilteringAttributes, ...) update the same step in place. - Removal. A generated step is deleted together with its attribute. A file counts as generated only when its id equals the id recomputed from its own content, so hand-written steps (random ids) are never touched.
- Adopting an existing step. Set
Idon the attribute (and on its images) to the existing step's id. The step file is then rewritten from the attribute and named{id}.xml; anything the attribute can't express is dropped. WithoutId, a hand-written step for the same plugin type, message, entity and stage produces a warning, because both would run. - Validation. The build fails on invalid registrations (pre-image on Create, post-image outside PostOperation, asynchronous step outside PostOperation, ambiguous image binding, unknown message without
MessageId, duplicate ids).
- Step identity. A step id is derived from assembly, plugin type, message, primary entity and stage, and an image id from its step, image type and alias. Changing any of those is a different step; renaming a type or moving it to another namespace too. Other settings (
- Workflow activities --
EnsureWorkflowActivityAssemblyDataXmlgenerates.data.xmlfor workflow activity assemblies. - Script libraries --
CopyScriptLibrariesToWebResourcesresolves web resource names with the publisher prefix, generates.data.xml, and registers root components inSolution.xml. - Code apps --
PrepareCodeAppsSourcesgenerates.meta.xmlviaGenerateCodeAppMetaXml, adds root components (Type 300) toSolution.xml, and ensures theCanvasAppsnode exists inCustomizations.xml.
4. Solution XML patching
PatchSolutionXml writes Version (use ApplyVersionNumber instead, see below), Managed, PublisherName, and PublisherPrefix into Solution.xml (all optional).
5. Solution packaging override and versioning
ProcessCdsProjectReferencesOutputs replaces the Microsoft default to filter ScriptLibrary, CodeApp, and WorkflowActivity references from solution packaging processing. Then GenerateVersionNumber and ApplyVersionNumber patch the version across all solution metadata.
6. Schema validation (manual)
ValidateSolutionComponentSchema validates all solution XML files against 22 bundled XSD schemas and JSON flows against a JSON schema. Validation runs in batch mode -- all errors are collected before failing the build, with MSBuild-canonical error format for IDE click-through.
This validation is not wired into the build pipeline automatically -- it must be invoked manually, e.g. dotnet build -t:ValidateSolutionComponentSchema.
7. Solution packaging
PowerAppsPackage invokes the tasks package's SolutionPackagerLib-based packager to produce the output .zip.
8. NuGet packing
dotnet pack produces a .nupkg with the solution .zip under content/solution/.
MSBuild Properties
General
| Property | Default | Description |
|---|---|---|
ProjectType |
Solution |
Marks the project as a solution for reference discovery. |
Version |
(required) | Base version; used for Git versioning and applied to solution.xml and related metadata. See Versioning. |
Solution metadata
| Property | Default | Description |
|---|---|---|
Managed |
(none) | Value written to the <Managed> element in solution.xml. |
PublisherName |
(none) | Value written to the publisher name fields in solution.xml. |
PublisherPrefix |
(none) | Value written to solution.xml and used as the web resource name prefix. |
Paths
| Property | Default | Description |
|---|---|---|
SolutionRootPath |
. |
Relative path to the solution source root. |
SolutionPackagerWorkingDirectory |
$(IntermediateOutputPath) |
Working folder for solution packager operations. |
SolutionPackagerMetadataWorkingDirectory |
$(SolutionPackagerWorkingDirectory)Metadata |
Metadata folder used for version updates. |
SolutionPackagerLocalizationWorkingDirectory |
(none) | Optional localization working folder (cleaned by CleanupWorkingDirectory). |
SolutionPackageLogFilePath |
$(IntermediateOutputPath)SolutionPackager.log |
SolutionPackager log path. |
SolutionPackageZipFilePath |
$(OutputPath)$(MSBuildProjectName).zip |
Output zip path for pack tasks. |
GeneratePackageOnPublish (default true) can be set to false in the csproj to skip the NuGet pack after dotnet publish.
SolutionPackager localization is enabled automatically when the solution contains .resx files under Resources (for example Resources/en-US/resources.en-US.resx), so translations are merged into the zip instead of being dropped. Set SkipSolutionLocalization to true to opt out. Setting SolutionPackageEnableLocalization to true still forces it on. Keep the .resx files up to date: a stale default-locale file is merged as is, and an invalid one fails the pack. The .NET SDK also treats .resx files under the project folder as embedded resources by default; if the build fails with a GetAssemblyAttributes error, set EnableDefaultEmbeddedResourceItems to false in the csproj.
Web resources and PCF
| Property | Default | Description |
|---|---|---|
WebResourcesDir |
$(MSBuildProjectDirectory)\$(SolutionRootPath)\WebResources\ |
Destination folder for script library web resources. |
GeneratePluginSteps |
true |
When false, skips generating plugin steps from [PluginStep] attributes. |
PcfForceUpdate |
(none) | Forwarded to ProcessCdsProjectReferencesOutputs to force PCF updates before solution packaging. |
Validation
| Property | Default | Description |
|---|---|---|
SkipDuplicateGuidValidation |
(unset) | When true, skips the _ValidateDuplicateGuidsBeforePackage check during build. |
SkipQuickFindValidation |
(unset) | When true, skips the _ValidateQuickFindViewsBeforePackage check during build. |
Schema validation via ValidateSolutionComponentSchema is not wired automatically -- invoke it manually (e.g. dotnet build -t:ValidateSolutionComponentSchema). No skip property is needed.
Related Packages
- Depends on:
TALXIS.DevKit.Build.Dataverse.Tasks,Microsoft.PowerApps.MSBuild.Solution - Discovers and builds:
Plugin,WorkflowActivity,ScriptLibrary,CodeApp, andPcfprojects viaProjectReference
Learn more about Target Frameworks and .NET Standard.
-
- Microsoft.PowerApps.MSBuild.Solution (>= 1.48.2)
- TALXIS.DevKit.Build.Dataverse.Tasks (>= 1.11.1)
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.11.1 | 2,073 | 10/25/2026 |
| 1.11.0 | 150 | 10/24/2026 |
| 1.10.0 | 101 | 10/24/2026 |
| 1.9.2 | 115 | 10/24/2026 |
| 1.9.1 | 124 | 10/22/2026 |
| 1.9.0 | 393 | 9/22/2026 |
| 1.8.4 | 906 | 8/11/2026 |
| 1.8.3 | 207 | 8/11/2026 |
| 1.8.2 | 213 | 8/11/2026 |
| 1.8.1 | 206 | 8/10/2026 |
| 1.8.0 | 234 | 7/29/2026 |
| 1.7.0 | 276 | 7/7/2026 |
| 1.6.1 | 1,830 | 6/29/2026 |
| 1.6.0 | 270 | 6/27/2026 |
| 1.5.1 | 352 | 5/26/2026 |
| 1.5.0 | 1,014 | 5/26/2026 |
| 1.4.0 | 750 | 5/14/2026 |
| 1.3.0 | 320 | 5/14/2026 |
| 1.2.2 | 451 | 5/4/2026 |
| 1.2.1 | 335 | 5/4/2026 |