Authoring (.bsetup)
The project format: a human-editable JSON document describing what to install and how the wizard behaves.
The .bsetup file
A project is a .bsetup file — camelCase JSON that tolerates comments and trailing commas. It round-trips through InstallerScriptSerializer (a deliberate, explicit key mapping, not reflection) and is authored either by hand or in the Package Builder UI. Paths are resolved relative to the script, not the working directory.
{
"ProjectName": "My App Installer",
"AppName": "MyApp",
"AppVersion": "1.2.0",
"AppPublisher": "The Tech Idea",
"SourceDir": "samples/HelloApp",
"DefaultDirName": "%ProgramFiles%/MyApp",
"PrivilegesRequired": "Admin",
"CreateUninstallEntry": true,
"SideBySide": false,
"AppUpdatesURL": "https://updates.example.com/stable/feed.json",
"AppUpdateMode": "Optional",
"Components": [ /* ... */ ]
}
The InstallProject model
InstallProject (an INotifyPropertyChanged graph in Beep.Installer.Core/Model) is the in-memory authoring model. Its main sections:
| Section | Purpose |
|---|---|
| Identity | AppName, AppVersion, AppPublisher, AppCopyright, support URL/email, icon. |
| Layout | DefaultDirName, PrivilegesRequired, Prefer64Bit, SideBySide, PayloadFolderName. |
Components[] | Selectable features, each with Files, Registry, Shortcuts, ComRegistrations, GacAssemblies, and visibility Conditions. |
| Prerequisites | OS/.NET/admin/disk-space checks and custom prerequisites with download URLs. |
| Custom actions | Executables/scripts run at BeforeInstall/AfterInstall/BeforeUninstall/AfterUninstall. |
| Branding | Welcome banner, colours, licence text, wizard pages. |
| Build & deploy | Output dir/name, compression, code-sign cert, output format, update feed URL/mode. |
Source scanning
When components carry no explicit file list, the build scans SourceDir (via SourceScanner + GlobMatcher), applying include/exclude globs. An include that names a conventionally build-only folder (e.g. bin/**) is treated as intent and wins over folder pruning; a pruned folder emits a warning rather than silently vanishing. A build that would ship an empty payload is a hard failure, not a silent success.
Custom wizard pages & fields
Beyond the standard pages, a project can define custom wizard pages with input fields (text, choice, checkbox). CustomPageManager is the single implementation of field validation, value collection, and {Custom:fieldId} macro expansion, which feeds into custom actions and file/registry values at runtime.