The DNN Manifest Schema
The DNN manifest is an XML file (e.g., MyDNNExtension.dnn) that indicates how specific files in the extension package must be processed during installation.
Only the files specifically declared in the manifest would be installed. Files inside any zip file specified in component type="ResourceFile"
do not have to be listed individually. Nonexistent files mentioned in the manifest will cause an error message.
The manifest file extension must be .dnn
. You can add the DNN version at the end; e.g., MyDNNExtension.dnn7
.
Save the manifest file in the base folder of your package and include it when zipping your package files.
Schema
<dotnetnuke type="Package" version="8.0">
<packages>
<package name="MyCompany.SampleModule" type="Module" version="1.0.0">
<friendlyName>My Sample Module</friendlyName>
<description>My Sample Module is a demonstration module.</description>
<iconFile>MyIcon.png</iconFile>
<owner>
<name>MyCompany or MyName</name>
<organization>MyCompany Corporation</organization>
<url>www.example.com</url>
<email>[email protected]</email>
</owner>
<license src="MyLicense.txt" />
<releaseNotes src="MyReleaseNotes.txt" />
<azureCompatible>true</azureCompatible>
<dependencies>
<dependency type="coreVersion">08.00.00</dependency>
...
</dependencies>
<components>
<component type="Module">
...
</component>
...
</components>
</package>
</packages>
</dotnetnuke>
package
<package name="MyCompany.MySampleModule" type="Module" version="1.0.0">
...
</package>
- name must be unique. To ensure your package's uniqueness, add your company as the prefix.
- type can be one of the following:
- Auth_System
- Container
- CoreLanguagePack
- DashboardControl
- ExtensionLanguagePack
- JavaScript_Library
- Library
- Module
- Provider
- Skin
- SkinObject
- other custom extension types
- version holds the version of your extension.
Each package represents a DNN extension. You can install multiple extensions using a single DNN manifest by creating a package
section for each extension inside the packages
tag.
Packages are installed in the order they appear in the manifest.
Only the information about the first package is displayed during installation. This includes the package name, description, owner, license, and release notes.
friendlyName and description
<friendlyName>My Sample Module</friendlyName>
<description>My Sample Module is a demonstration module.</description>
The friendlyName and description are displayed during installation and are used in the
page, which lists the extensions that are installed or are available for installation. The friendlyName can contain spaces and up to 250 characters; the description can hold up to 2000 characters.iconFile
<iconFile>MyIcon.png</iconFile>
Optional. The icon is displayed in the DNN Control Panel's dropdown list and in the Extensions page. The .png format is preferred. If not specified, the DNN default icon is used.
owner
<owner>
<name>MyCompany or MyName</name>
<organization>MyCompany Inc.</organization>
<url>www.example.com</url>
<email>[email protected]</email>
</owner>
Optional, but encouraged. Information about the owner or creator of the extension.
license and releaseNotes
<license src="MyLicense.txt" />
<releaseNotes src="MyReleaseNotes.txt" />
Optional, but encouraged. These text files are displayed during the installation. The user is prompted to accept or decline the license. The release notes is displayed during the installation. The actual text can also be embedded within the tag without the src attribute.
azureCompatible
<azureCompatible>true</azureCompatible>
Optional. Default is false
. Set to true
if the extension is compatible with Microsoft Azure.
dependencies
<dependencies>
<dependency type="coreVersion">08.00.00</dependency>
...
</dependencies>
Dependencies can be any of these types (case-insensitive):
- coreVersion. Minimum DNN version required by the extension being installed. Example:
<dependency type="coreVersion">08.00.00</dependency>
- managedPackage. The name and minimum version of a package required by the extension being installed. The required package must already be listed in the core Packages table.
<dependency type="managedPackage" version="1.0.0">AnotherPackageRequiredByThisComponent</dependency>
- package. The name of a package required by the extension being installed. The required package must already be listed in the core Packages table. Example:
<dependency type="package">AnotherPackageRequiredByThisComponent</dependency>
- type. A type in .NET, in a DNN library, or a third-party library. Ensures that the installation can create an object of the specified type. Example:
<dependency type="type">System.Security.Principal.GenericPrincipal</dependency>
Tip: Fully qualify a type if it is not in the App_Code folder to avoid conflicts with similarly named types from multiple sources. - Any custom dependency type included in the Dependency list. DNN can be extended by creating custom dependency types, which inherit from DotNetNuke.Services.Installer.Dependencies.DependencyBase and must be included in the Dependency list ( ). Example:
<dependency type="SomeCustomDependencyType">ValueNeededBySomeCustomDependencyType</dependency>
Note: The custom dependency type must already be installed before it is used in another installation.
components
<components>
<component type="..." />
<component type="..." />
...
</components>
Some component types are applicable only to the package type of the same name; generic component types can be used with any package type.
Package type | Specific component type | Generic component types |
---|---|---|
Auth_System | AuthenticationSystem |
Assembly Cleanup Config File ResourceFile Script |
Container | Container | |
CoreLanguagePack | CoreLanguage | |
DashboardControl | DashboardControl | |
ExtensionLanguagePack | ExtensionLanguage | |
JavaScript_Library | ||
Library | ||
Module | Module | |
Provider |
Provider URL Provider |
|
Skin | Skin | |
SkinObject | SkinObject |
Assembly
. Assemblies to be installed in the main \bin folder of the installation. Assemblies are the compiled code portion of your extension. They can be your own assemblies or third-party assemblies that you ship with your extension.<component type="Assembly"> <assemblies> <assembly> <path / <!-- Path of the assembly to install. Relative to the \bin folder of the DNN installation. --> <name / <!-- Name of the assembly to install. --> <version / <!-- Version of the assembly to install. --> </assembly> <assembly action="Unregister"> <path / <!-- Path of the assembly to remove. Relative to the \bin folder of the DNN installation. --> <name / <!-- Name of the assembly to remove. --> <version / <!-- Version of the assembly to remove. --> </assembly> ... </assemblies> </component>
AuthenticationSystem
. Authentication providers used by the extension, such as Facebook, Google, Twitter, and Microsoft Accounts. By default, DNN authenticates using its own database.<component type="AuthenticationSystem"> <authenticationService> <type>Facebook</type> <settingsControlSrc /> <loginControlSrc /> <logoffControlSrc /> </authenticationService> <authenticationService /> ... </component>
Cleanup
. List of files that must be deleted during installation or upgrade of the package.You can list the files individually in the manifest.
<component type="Cleanup" version="07.40.00"> <files> <file> <path>bin</path> <name>MyFile.dll</name> </file> <file /> ... </files> </component>
You can also list the files with their paths in a text file instead.
<component type="Cleanup" version="07.40.00" fileName="ListOfFilesToDelete.txt" />
See also:- Component type
Config
to update configuration files during uninstall. - Component type
Script
for data provider scripts that must be uninstalled.
- Component type
Config
. Changes to do on the specified config file.<component type="Config"> <config> <configFile>web.config</configFile <!-- Name of config file, including its path relative to the root of the DNN installation. --> <install> <configuration> <nodes> <node path="/configuration/system.webServer/handlers" action="update" key="path" collision="overwrite"> ... </node> <node /> ... </nodes> </configuration> </install> <uninstall> <configuration> <nodes /> </configuration> </uninstall> </config> <config /> ... </component>
For information on
node
attributes, see Manifest: XML Merge.Container
. Containers to be installed.<component type="Container"> <containerFiles> <basePath / <!-- Target base folder for the component installation. Relative to the root of the DNN installation. --> <containerName /> <containerFile> <path / <!-- Target file folder. Relative to basePath. --> <name /> </containerFile> <containerFile /> ... </containerFiles> </component>
DashboardControl
. Controls that will appear as separate tabs in the DNN Dashboard ( ).<component type="DashboardControl"> <dashboardControl> <key /> <src /> <localResources /> <controllerClass /> <isEnabled /> <viewOrder /> </dashboardControl> <dashboardControl /> ... </component>
File
. Files to be installed. By default, only files with allowed file extensions are installed; however, the host user can bypass this security check during installation. To view or modify the list of file extensions, go to your DNN installation and choose .<component type="File"> <files> <basePath / <!-- Target base folder for the component installation. Relative to the root of the DNN installation. --> <file> <path / <!-- Target file folder. Relative to basePath. Also assumed to be the source file folder in the zip file, if sourceFileName is not defined. --> <name /> <sourceFileName / <!-- The path and name of a file inside the zip file. --> </file> <file /> ... </files> </component>
Example: To copy img/MyAwesomeImageFile.jpg from the zip file to desktopmodules/mymodule/images/MyFile.jpg,<basePath>desktopmodules/mymodule</basePath> <file> <path>images</path> <name>MyFile.jpg</name> <sourceFileName>img/MyAwesomeImageFile.jpg</sourceFileName> </file>
CoreLanguage
. Language pack files required to localize the core DNN Platform for a specific culture. A core language pack can be installed during the DNN Platform installation or anytime after.<component type="CoreLanguage"> <languageFiles> <code /> <displayName /> <fallback / <!-- Code for the alternative language. Used if a resource is not found in the current language pack. --> <languageFile> <path / <!-- Target file folder. Relative to the root of the DNN installation. --> <name /> </languageFile> <languageFile /> ... </languageFiles> </component>
For the list of supported language codes, see the .NET CultureInfo class.
ExtensionLanguage
. Language pack files required to localize a DNN extension for a specific culture.<component type="ExtensionLanguage"> <languageFiles> <code /> <package / <!-- Name of another package that contains the extension that this language pack is intended for. --> <basePath / <!-- Target base folder for the component installation. Relative to the root of the DNN installation. --> <languageFile> <path / <!-- Target file folder. Relative to basePath. --> <name /> </languageFile> <languageFile /> ... </languageFiles> </component>
For the list of supported language codes, see the .NET CultureInfo class.
Module
. Only one component withtype="Module"
is allowed within apackage
section. To install a set of modules as a unit, create onepackage
section per module in the same manifest.<component type="Module"> <desktopModule> <moduleName /> <foldername /> <businessControllerClass /> <codeSubdirectory /> <isAdmin /> <isPremium /> <supportedFeatures<!-- Requires a value for businessControllerClass. --> <supportedFeature type="Portable" /<!-- The module has import/export capabilities using the IPortable interface. --> <supportedFeature type="Searchable" /<!-- The module can be indexed or searched using the ISearchable interface. --> <supportedFeature type="Upgradeable" /<!-- The module can be upgraded using the IUpgradeable interface. --> ... </supportedFeatures> <moduleDefinition> <friendlyName /> <defaultCacheTime /> <moduleControls> <moduleControl> <controlKey /> <controlSrc /> <supportsPartialRendering /> <controlTitle /> <controlType /> <iconFile /> <helpUrl /> </moduleControl> <moduleControl /> ... </moduleControls> <permissions> <!-- In <permission>, "code" is the code for the module, "key" is the code for the permission, and "name" is the user-friendly name for the permission. --> <permission code="..." key="..." name="..." /> <permission code="..." key="..." name="..." /> ... </permissions> </moduleDefinition> </desktopModule> <eventMessage> <processorType /> <processorCommand /> <attributes> <node>value</node> </attributes> </eventMessage> </component>
Provider
. Extends the list of allowed file extensions. These additional file extensions apply only to the current installation and are not added to the global list of file extensions found in . The following file extensions can be allowed: .ashx, .aspx, .ascx, .vb, .cs, .resx, .css, .js, .resources, .config, .xml, .htc, .html, .htm, .text, .vbproj, .csproj, and .sln.<component type="Provider" />
ResourceFile
. Zip files to be expanded during installation. Can be used instead ofcomponent type="File"
to simplify the manifest for packages that contain many files.<component type="ResourceFile"> <resourceFiles> <basePath /<!-- Target folder where the contents of the zip file will be installed. Relative to the root of the DNN installation. --> <resourceFile> <name /<!-- Name of zip file. --> </resourceFile> <resourceFile /> ... </resourceFiles> </component>
Script
. Database scripts that the extension needs. The following scripts are handled differently:install.<dataprovidertype>
(e.g.,install.SqlDataProvider
) is executed before all other scripts, if the package is being installed for the first time.upgrade.<dataprovidertype>
(e.g.,upgrade.SqlDataProvider
) is executed after all regular scripts.
<component type="Script"> <scripts> <basePath /<!-- Target base folder for the component installation. Relative to the root of the DNN installation. --> <script type="Install" > <path /<!-- Target file folder. Relative to basePath. --> <name /<!-- Must be named "<scriptversion>.<dataprovider>". Example: 01.00.00.SqlDataProvider --> <version /<!-- Version of script file to be installed. --> </script> <script type="UnInstall" > <path /<!-- Location of script file. Relative to basePath. --> <name /<!-- Must be named "uninstall.<dataprovidertype>". Example: uninstall.SqlDataProvider --> <version /<!-- Version of script file to be removed. --> </script> ... </scripts> </component>
Skin
. All files related to the theme. The installer needs to parse the main theme files at installation time to replace relative folder names; therefore, every ASCX, HTML, or CSS file must be declared as askinFile
. Other files (i.e., images and scripts) can be packaged using component typeResourceFile
to simplify the complexity of the theme manifest.<component type="Skin"> <skinFiles> <basePath /<!-- Target base folder for the component installation. Relative to the root of the DNN installation. --> <skinName /> <skinFile> <path /<!-- Target file folder. Relative to basePath. --> <name /> </skinFile> <skinFile /> ... </skinFiles> </component>
SkinObject
. Custom theme objects.<component type="SkinObject"> <moduleControl> <controlKey /<!-- Token of the skin object within square brackets []; e.g., [COPYRIGHT] --> <controlSrc /<!-- Target file folder for the theme object's ASCX file. --> <supportsPartialRendering /<!-- "true" if the theme object supports partial rendering through an MS AJAX update panel wrapper. Default: "false" --> </moduleControl> </component>
URLProvider
. Custom URL provider to be used with the Advanced URL Management System (AUM).<component type="URLProvider"> <urlProvider> <name /> <type /> <settingsControlSrc /> <redirectAllUrls /> <replaceAllUrls /> <rewriteAllUrls /> <desktopModule /> </urlProvider> </component>