Created
November 26, 2013 21:35
-
-
Save randyburden/7666678 to your computer and use it in GitHub Desktop.
NuGet Installation Splash Page Script - Add this file under a folder named "tools" in the root of your NuGet package and it will open a splash web page upon package install.
I have made the file more generic for better re-usability. Simply replace the $url variable value with your own URL and replace the $packageName variable value with the name…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
param($installPath, $toolsPath, $package, $project) | |
# open splash page on package install | |
# don't open if it is installed as a dependency | |
# attribution: Modified from: https://github.com/JamesNK/Newtonsoft.Json/blob/master/Build/install.ps1 | |
try | |
{ | |
$url = "http://randyburden.com/Slapper.AutoMapper/" | |
$packageName = "slapper.automapper" | |
$dte2 = Get-Interface $dte ([EnvDTE80.DTE2]) | |
if ($dte2.ActiveWindow.Caption -eq "Package Manager Console") | |
{ | |
# user is installing from VS NuGet console | |
# get reference to the window, the console host and the input history | |
# show webpage if "install-package YourPackageName" was last input | |
$consoleWindow = $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]) | |
$props = $consoleWindow.GetType().GetProperties([System.Reflection.BindingFlags]::Instance -bor ` | |
[System.Reflection.BindingFlags]::NonPublic) | |
$prop = $props | ? { $_.Name -eq "ActiveHostInfo" } | select -first 1 | |
if ($prop -eq $null) { return } | |
$hostInfo = $prop.GetValue($consoleWindow) | |
if ($hostInfo -eq $null) { return } | |
$history = $hostInfo.WpfConsole.InputHistory.History | |
$lastCommand = $history | select -last 1 | |
if ($lastCommand) | |
{ | |
$lastCommand = $lastCommand.Trim().ToLower() | |
if ($lastCommand.StartsWith("install-package") -and $lastCommand.Contains($packageName)) | |
{ | |
$dte2.ItemOperations.Navigate($url) | Out-Null | |
} | |
} | |
} | |
else | |
{ | |
# user is installing from VS NuGet dialog | |
# get reference to the window, then smart output console provider | |
# show webpage if messages in buffered console contains "installing...YourPackageName" in last operation | |
$instanceField = [NuGet.Dialog.PackageManagerWindow].GetField("CurrentInstance", [System.Reflection.BindingFlags]::Static -bor ` | |
[System.Reflection.BindingFlags]::NonPublic) | |
$consoleField = [NuGet.Dialog.PackageManagerWindow].GetField("_smartOutputConsoleProvider", [System.Reflection.BindingFlags]::Instance -bor ` | |
[System.Reflection.BindingFlags]::NonPublic) | |
if ($instanceField -eq $null -or $consoleField -eq $null) { return } | |
$instance = $instanceField.GetValue($null) | |
if ($instance -eq $null) { return } | |
$consoleProvider = $consoleField.GetValue($instance) | |
if ($consoleProvider -eq $null) { return } | |
$console = $consoleProvider.CreateOutputConsole($false) | |
$messagesField = $console.GetType().GetField("_messages", [System.Reflection.BindingFlags]::Instance -bor ` | |
[System.Reflection.BindingFlags]::NonPublic) | |
if ($messagesField -eq $null) { return } | |
$messages = $messagesField.GetValue($console) | |
if ($messages -eq $null) { return } | |
$operations = $messages -split "==============================" | |
$lastOperation = $operations | select -last 1 | |
if ($lastOperation) | |
{ | |
$lastOperation = $lastOperation.ToLower() | |
$lines = $lastOperation -split "`r`n" | |
$installMatch = $lines | ? { $_.StartsWith("------- installing..." + $packageName) } | select -first 1 | |
if ($installMatch) | |
{ | |
$dte2.ItemOperations.Navigate($url) | Out-Null | |
} | |
} | |
} | |
} | |
catch | |
{ | |
# stop potential errors from bubbling up | |
# worst case the splash page won't open | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment