Exam Area: Content Area 2 – Installation, Operation & Configuration (20%)
Reference: https://docs.developers.optimizely.com/content-management-system/docs/installing-add-ons
Add-ons (also called Apps) are NuGet packages that extend the functionality of Optimizely CMS.
# Via .NET CLI
dotnet add package EPiServer.Forms --version 5.*
dotnet add package EPiServer.Find --version 14.*
# Via NuGet Package Manager in Visual Studio
# Search → Install → Restore
Most add-ons require service registration in Program.cs:
// Example: Optimizely Forms
builder.Services.AddEpiserverForms();
// Example: Optimizely Find/Search
builder.Services.AddFind();
// Example: TinyMCE (included in EPiServer.CMS.TinyMce)
builder.Services.AddTinyMce();
Some add-ons require a module.config entry:
<?xml version="1.0" encoding="utf-8"?>
<module>
<assemblies>
<add assembly="EPiServer.Forms" />
<add assembly="EPiServer.Forms.UI" />
</assemblies>
</module>
# Update an add-on
dotnet add package EPiServer.Forms --version 5.x.x
# Check for outdated packages
dotnet list package --outdated
# Build to check for breaking changes
dotnet build
| Add-on | NuGet Package | Description |
|---|---|---|
| Optimizely Forms | EPiServer.Forms | Form builder |
| Search & Navigation | EPiServer.Find | Full-text search |
| TinyMCE | EPiServer.CMS.TinyMce | Rich text editor |
| Google Analytics | EPiServer.GoogleAnalytics | GA integration |
| Languages | EPiServer.Languages | Language management |
| Geta.NotFoundHandler | Geta.NotFoundHandler | 404 management |
| ImageVault | ImageVault.EPiServer | Digital Asset Management |
Add-ons typically install into:
packages/ folderwwwroot/ (client resources)// Add-ons can use IInitializableModule for initialization
[InitializableModule]
[ModuleDependency(typeof(ServiceContainerInitialization))]
public class FormsInitialization : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
// Initialize forms
}
public void Uninitialize(InitializationEngine context) { }
}
<!-- In .csproj, pin version if needed -->
<PackageReference Include="EPiServer.CMS" Version="[12.5.0]" /> <!-- Exact -->
<PackageReference Include="EPiServer.Forms" Version="5.*" /> <!-- Minor range -->
<PackageReference Include="Newtonsoft.Json" Version="13.0.*" /> <!-- Patch range -->
# Check dependency tree
dotnet list package --include-transitive
# If conflict, pin the version
// Add-on must have ModuleDependency attribute in AssemblyInfo
[assembly: ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
// Add-on project structure:
// MyAddon/
// ├── ClientResources/ (JS, CSS)
// ├── Models/
// ├── module.config
// └── MyAddon.csproj
// Add-ons inject scripts into the CMS UI
// module.config
<clientResources>
<add name="MyAddonScript"
path="ClientResources/Scripts/addon.js"
resourceType="Script" />
</clientResources>
// Or via code in initialization
public class MyAddonInit : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
// Inject client resources
var requiredResources = context.Locate.Advanced
.GetInstance<IRequiredClientResourceList>();
requiredResources.RequireScript("~/ClientResources/addon.js")
.AtFoot();
}
}
marketplace.optimizely.com)IRequiredClientResourceList)