Creating VSIX Chocolatey Packages
This post outlines how to create a Chocolatey package for a VSIX file based on the Cake for Visual Studio extension.
We will start with the package definition:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
<metadata>
<id>my.vs2017.cake</id>
<title>Visual Studio 2017 Cake Extension</title>
<version>0.2.0.0</version>
<authors>Cake Build</authors>
<owners>Florian Winkelbauer</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Adds the Cake extension to Visual Studio 2017</description>
<copyright>Copyright 2018</copyright>
<tags>cake visual studio 2017</tags>
<dependencies>
<dependency id="chocolatey-visualstudio.extension" />
</dependencies>
</metadata>
</package>
Notice the declared dependency chocolatey-visualstudio.extension which allows us to install a VSIX file using PowerShell.
To create the install/uninstall scripts we will need the following information:
- The VSIX ID
- A URL to download the VSIX file
- The current version of the extension
- A file checksum
I have created a small helper function to fetch the above data. This function requires the checksum package to be installed:
function Get-VsixData {
param($url, $checksumType)
$page = Invoke-WebRequest -Uri $url
$vsixId = ($page.AllElements |
Where Class -eq 'vsixId' |
Select -ExpandProperty innerHTML).Trim() -replace '"', ''
$json = $page.AllElements |
Where Class -eq 'vss-extension' |
Select -ExpandProperty innerHtml |
ConvertFrom-Json |
Select -ExpandProperty versions
$vsixVersion = $json.version
$vsixUrl = $json.files |
where assetType -match '\.vsix$' |
Select -ExpandProperty source
$file = Join-Path $env:TMP 'tmp.vsix'
Invoke-WebRequest -Uri $vsixUrl -OutFile $file
$checksum = checksum -f="$file" -t="$checksumType"
Remove-Item $file
return @{ VsixId = $vsixId; VsixVersion = $vsixVersion; VsixUrl = $vsixUrl; Checksum = $checksum; ChecksumType = $checksumType }
}
Here's the console output for the Cake extension:
Get-VsixData 'https://marketplace.visualstudio.com/items?itemName=vs-publisher-1392591.CakeforVisualStudio' 'sha256' Name Value ---- ----- VsixId 3cf9b016-d63f-44ee-849d-6f3efc996134 VsixVersion 0.2.0.0 VsixUrl https://vs-publisher-1392591.gallerycdn.vsassets.io/extensions/vs-publisher-1392591/cakeforvisualstudio/0.2.0.0/1503436806448/229353/4/Cake.VisualStudio.vsix Checksum 752A01E2A40A5DED7BED6FC16930B347205030AE693C75D3D5DC76DCCE407D02 ChecksumType sha256
With this information we now can create our install logic:
$ErrorActionPreference = 'Stop'
$parameters = @{
PackageName = $env:ChocolateyPackageName
VsixUrl = 'https://vs-publisher-1392591.gallerycdn.vsassets.io/extensions/vs-publisher-1392591/cakeforvisualstudio/0.2.0.0/1503436806448/229353/4/Cake.VisualStudio.vsix'
Checksum = '752A01E2A40A5DED7BED6FC16930B347205030AE693C75D3D5DC76DCCE407D02'
ChecksumType = 'sha256'
}
Install-VisualStudioVsixExtension @parameters
And the uninstall logic:
$ErrorActionPreference = 'Stop'
$parameters = @{
PackageName = $env:ChocolateyPackageName
VsixId = '3cf9b016-d63f-44ee-849d-6f3efc996134'
}
Uninstall-VisualStudioVsixExtension @parameters
Creating and updating several VSIX packages could be further automated using the above helper function in combination with tools such as the Chocolatey Auto Updater.