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. |