dversedev

Reference

dataverse.yaml

One committed file, no secrets in it. Most repositories declare a single environment — the sandbox you develop against — and reach production by exporting a managed solution, not by applying to it.

Declaring nothing for a component kind means dverse manages nothing of that kind. That is the safe default when adopting dverse into an organization whose publisher prefix is older than the repository: each set's path and prefix is also its prune boundary, so dverse only ever deletes inside a scope you declared.

Top level

The file is committed and holds no secrets. A personal override lives in dataverse.local.yaml, which is gitignored — that is how each developer points at their own sandbox without touching the shared file.

default: dev

environments:
  dev:
    url: https://contoso-dev.crm4.dynamics.com
    solution: contoso
    prefix: contoso

model:
  entities: [account, contact]
default string Name of the environment commands target when nothing else resolves one.
model object Which tables the generator emits early-bound classes for.
schema object Tables, columns, option sets and relationships declared as code.
signing object Authenticode signing, applied to every assembly. Can also be set per environment.
environments map One entry per environment, keyed by name. Usually just one.

model:

Feeds the source generator through the committed dataverse.snapshot.json. The generator never reads dataverse.yaml itself — everything reaches it through the snapshot, which is what keeps builds reproducible and CI free of any Dataverse connection.

model.entities string[] Logical names of the tables to generate model classes for.
model.namespace string Namespace for generated code. Default: Dverse.Model.
model.language int LCID naming option-set enum members. Default: 1033. Pinning it stops identifiers depending on who ran the sync.
model.classNames map Per-entity class renames. Default: the schema name.

schema:

Tables, columns, option sets, relationships and keys as code. Capture what already exists with dverse schema adopt.

schema.files string[] Paths to YAML files each holding tables: / extensions: lists.
schema.tables object[] Inline table declarations — an alternative to files: for small schemas.
schema.extensions object[] Columns and keys added to tables dverse does not own, such as account. The host table itself is never touched.

signing:

Authenticode-signs every plugin assembly before upload — required before an assembly can be bound to a managed identity. Signing is deterministic, so an unchanged assembly still skips its upload. Create the certificate with dverse sign init.

signing.certificate string Path to the .pfx.
signing.password string Certificate password. Only as ${ENV_VAR} — never a literal.

environments.<name>:

One deployment target. url, solution and prefix are the whole minimum; everything else is opt-in, and a component kind you declare nothing for is never managed and never pruned.

url string Environment URL.
solution string Unmanaged solution components are added to. Created if missing.
prefix string Publisher customization prefix. Created if missing.
assemblies object[] Plugin assemblies to deploy.
webresources object[] Web resource sets.
pcf object[] PCF control projects.
environmentVariables map Environment variable definitions and values.
seed object[] Reference data rows to upsert.
views object[] Saved-query sets.
forms object[] Form sets.
apps object[] Model-driven apps and their sitemaps.
ribbons object[] Classic RibbonDiffXml sets.
commands object[] Modern command (appaction) sets.
signing object Per-environment override of the top-level signing:.
managedIdentity object Managed identity to create and bind.

assemblies:

Each entry is one plugin assembly. Omit the block entirely and dverse discovers the project at or below the directory you run from.

path string Path to the plugin project or its built assembly.
package bool Deploy as a plugin package (nupkg with dependent assemblies). Inferred from the project's <DversePluginPackage> when omitted.
packageId string Package unique id. Defaults to the assembly name.

webresources:

Built, content-hash diffed, and published in the apply's single PublishXml. Environment resources under the prefix with no local file are pruned — the repository is the source of truth.

path string Local directory of deployable files.
prefix string Unique-name prefix, e.g. contoso_/. Also the prune boundary.
solution string Solution to add the resources to.
build string Build command run before diffing, e.g. an esbuild invocation.
buildDir string Directory the build command runs in.
prune bool Set false to keep environment-only resources in this set.
map map Local path → existing unique name, for legacy resources that must keep their names. Value may be a string or { name, type }.

pcf:

Deployed via a staged solution import and hash-diffed, so an unchanged control is zero writes. Scaffold one with dverse pcf init. A control is only picked up when its manifest version increases — apply bumps it for you.

path string The control project directory.
solution string Solution to add the control to.
build string Build command. Defaults to the standard pcf-scripts build.

environmentVariables:

Keyed by schema name. A bare string is the value; the object form also declares the type so dverse can create the definition.

<schemaName>.value string The value to set.
<schemaName>.type string Definition type, e.g. String, Number, Boolean, JSON, Secret.

seed:

Reference data, upserted. Runs last, after every component it might depend on exists.

entity string Target table.
rows object[] The rows.
rows[].mode string createOnly to insert without updating an existing row.
rows[].key string Alternate key used to match.
rows[].match map Column/value pairs used to match when no alternate key exists.
rows[].values map Column values to write. ${NAME} resolves from --seed-param or the environment.

views: · forms: · ribbons: · apps:

Committed UI fragments. Views and forms are captured with dverse views pull / forms pull and are never pruned. Apps are packed and imported by dverse itself — no pac needed.

path string Directory holding the committed files.
solution string Solution to add the components to.
uniqueName string apps: only — the app module's unique name.

commands:

Modern commands (appaction rows) declared in YAML with a real field-level diff, so a changed label is one PATCH of one column. Capture existing ones with dverse commands pull.

path string Directory holding the committed command YAML.
prefix string Name prefix this set manages. Also the prune boundary.
solution string Solution to add the commands to.
prune bool Set false to keep environment-only commands in this set.

managedIdentity:

Creates the managedidentity row and binds it to the assembly, so plugins reach Azure with no stored credentials via ctx.ManagedIdentity. The assembly must be Authenticode-signed first. dverse sign info prints the exact federated credential to create in Azure.

applicationId guid The Entra application id.
tenantId guid Tenant id. Discovered when omitted.
name string Identity row name. Applied on create only, so an identity someone else registered is never silently renamed.