Skip to content

SaaS short names and single-installer composition

Companion to:

Canonical short names

Repo dotnet new short name Identity Installer NuGet
ConnectSoft.Saas.TenantsTemplate connectsoft-saas-tenants ConnectSoft.Saas.TenantsTemplate ConnectSoft.Saas.TenantsTemplate.Installer
ConnectSoft.Saas.ProductsCatalogTemplate connectsoft-saas-productscatalog ConnectSoft.Saas.ProductsCatalogTemplate ConnectSoft.Saas.ProductsCatalogTemplate.Installer
ConnectSoft.Saas.EntitlementsTemplate connectsoft-saas-entitlements ConnectSoft.Saas.EntitlementsTemplate ConnectSoft.Saas.EntitlementsTemplate.Installer
ConnectSoft.Saas.BillingTemplate connectsoft-saas-billing ConnectSoft.Saas.BillingTemplate ConnectSoft.Saas.BillingTemplate.Installer
ConnectSoft.Saas.MeteringTemplate connectsoft-saas-metering ConnectSoft.Saas.MeteringTemplate ConnectSoft.Saas.MeteringTemplate.Installer

Short names are set in two files per repo and must match:

  • .template.config/template.json (minimal stub, authored checked-in copy)
  • template/<context>.template.extend.json (identityOverrides.shortName) — the CI composer applies this on top of the base metadata.

Single-installer invariant

Each .nupkg built by azure-pipelines-template.yml must register exactly one dotnet new template. The composer script (build/template-compose.ps1) is responsible for:

  1. Replacing the base template's identity, groupIdentity, name, shortName, description, tags, classifications with the extender's values.
  2. Rewriting sources so base-template/ is preserved as a folder but ignored as a content source root (no unintended double scaffolding).

After composition, azure-pipelines-template.yml strips base-template/.template.config/ from the final composed package:

$baseTplToStrip = Join-Path $extenderRoot 'base-template' '.template.config'
if (Test-Path $baseTplToStrip) { Remove-Item -Recurse -Force $baseTplToStrip }

This guarantees the shipped installer registers the single extended template (connectsoft-saas-<context>) and does not collide with ConnectSoft.BaseTemplate.Installer / connectsoft-base which ships separately.

CI gate

Every SaaS repo's azure-pipelines-template.yml runs the following CI gate after composition:

dotnet new install <composed>.nupkg --force
dotnet new connectsoft-saas-<context> -n <instance> -o <gen-out>
dotnet build <gen-out>/<instance>/<instance>.slnx -c Release

Failures on any step block the pipeline. The gate proves:

  • The installer resolves only one short name.
  • The short name matches the canonical matrix above.
  • The generated solution compiles under the multi-dialect SaaS defaults (PostgreSQL chosen for the gate).

Changing a short name

Strictly forbidden without an ADR in the relevant SaaS repo and a synchronized update to:

  • .template.config/template.json
  • template/<context>.template.extend.json
  • <RepoName>.Template.nuspec (tags)
  • docs/getting-started.md
  • The matrix above.

ConnectSoft.AI.SoftwareFactory template catalog must also be updated (see Factory generation wiring).