SaaS short names and single-installer composition¶
Companion to:
- template-naming-guide.md
- template-metadata-composition.md
- extended-template-base-submodule-guide.md
- SaaS Template Baseline Checklist
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:
- Replacing the base template's
identity,groupIdentity,name,shortName,description,tags,classificationswith the extender's values. - Rewriting
sourcessobase-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.jsontemplate/<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).