How to create a Package Template

How to create a Package Template

Chocolatey templates are one of the more lesser-known, yet very powerful, features of Chocolatey. Templates can be created for many different types of packages, and will allow for packages of a particular type to be extremely consistent. You could create package templates for packages that:

  • Runs an msi installer
  • Runs an exe installer
  • Copies files to specific places
  • Makes registry edits

The key takeaway is templates are only limited by your imagination, and can be as flexible as you need them to be.

One of the most powerful advantages of templates is their ability to use key-value pairs to pass specific data into a package. For example, you may have a need to create multiple packages whose only difference is the location in which they will be used. In this situation, you could pass the location data to your template, which could update the necessary portions of any scripts included in the template.

Creating Your Template

Templates are stored in the C:\ProgramData\chocolatey\templates directory. The name of the folder must match the name you wish to give the template.

Create Template Directories

Execute the following in an elevated PowerShell window to create our template folder.

New-Item -Path 'C:\ProgramData\chocolatey\templates\TutorialTemplate','C:\ProgramData\chocolatey\templates\TutorialTemplate\tools' -ItemType Directory

Create Install Script

We'll next create a very simple chocolateyInstall.ps1 script for our template.

Execute the following in an elevated PowerShell window to create the script.

 @'
Write-Host "I am from [[Country]]"
'@ | Set-Content 'C:\ProgramData\chocolatey\templates\TutorialTemplate\tools\chocolateyInstall.ps1'

Create Package Metadata

We'll use the following for our template metadata. Execute the following in an elevated PowerShell window.

@'
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
  <metadata>
    <id>[[PackageNameLower]]</id>
    <version>[[PackageVersion]]</version>
    <owners>SweetTooth</owners>
    <title>template-tutorial (Install)</title>
    <authors>Chocolatey]</authors>
    <tags>template</tags>
    <summary>Tutorial package from template</summary>
    <description>This was built from a template with [[Country]] passed to it.</description>
  </metadata>
  <!-- this section controls what actually gets packaged into the Chocolatey package -->
  <files>
    <file src="tools\**" target="tools" />
  </files>
</package>
'@ | Set-Content 'C:\ProgramData\chocolatey\templates\TutorialTemplate\file.nuspec'

Understanding Templated Values

In the code above you'll no doubt have noticed several instances of placeholders in [[this]] format. Items wrapped in [[]] will be replaced by the value from the command-line.

Placeholders are addressed as key:value pairs on the commandline where the key is the placeholder and value is what will be replaced in the file.

Building Package From Template

Let's see this usage of a template in practice. In an elevated PowerShell window execute the following

# Substitute the country USA with your own Country below
Set-Location '~\tutorials'
choco new template-tutorial --version='1.0.0' --template='TutorialTemplate' Country=USA
choco pack .\template-tutorial\template-tutorial.nuspec

Install Your Templated Package

We can validate that our package used the template correctly by installing it. Run the following in an elevated PowerShell window.

choco install template-tutorial -y

Uninstall Your Templated Package

You can remove this tutorial package with the following

choco uninstall template-tutorial -y