2012-06-15 13 views
5

Estoy creando un paquete NuGet, y me gustaría que el paquete muestre una notificación cada vez que haya una actualización para el paquete en el repositorio (que es un repositorio privado, no el NuGet oficial) repositorio).Crear un paquete NuGet que muestre notificaciones de actualización

Tenga en cuenta que no quiero que el paquete se actualice automáticamente (en caso de que la nueva versión pueda presentar algunos problemas), simplemente notifíquelo al usuario.

Para ello, he añadido esto en mi archivo init.ps1 en el paquete:

param($installPath, $toolsPath, $package, $project) 
$PackageName = "MyPackage" 
$update = Get-Package -Updates | Where-Object { $_.Id -eq $PackageName } 
if ($update -ne $null -and $update.Version -gt $package.Version) { 
    [System.Windows.Forms.MessageBox]::Show("New version $($update.Version) available for $($PackageName)") | Out-Null 
} 

se necesita el control sobre $update.Version -gt $package.Version para evitar mostrar la notificación cuando se instala el paquete más reciente.

me gustaría saber si

  1. Esta solución es aceptable, o si hay una manera mejor y "estándar" de hacer esto (en lugar de elaboración de la cerveza mi propia solución).
  2. Hay una forma mejor de mostrar una notificación, ya que MessageBox es bastante molesto: se esconde detrás del cuadro de diálogo "preparando solución" cuando abro el proyecto, y la operación no se completa hasta que hago clic en Aceptar.

Respuesta

3

Al final, no he encontrado una manera mejor de mostrar una notificación que a través del archivo init.ps1.
También descubrí que la secuencia de comandos de inicio se ejecuta solo si la consola de Package Manager está visible, lo cual no es exactamente ideal para este propósito, pero aun así no pude encontrar nada mejor.

Sobre la forma de notificar al usuario, he encontrado algunos métodos, que publico aquí en caso de que puedan ser útiles para otra persona.

param($installPath, $toolsPath, $package, $project) 
if ($project -eq $null) { 
    $projet = Get-Project 
} 

$PackageName = "MyPackage" 
$update = Get-Package -Updates -Source 'MySource' | Where-Object { $_.Id -eq $PackageName } 
# the check on $u.Version -gt $package.Version is needed to avoid showing the notification 
# when the newer package is being installed 
if ($update -ne $null -and $update.Version -gt $package.Version) { 

    $msg = "An update is available for package $($PackageName): version $($update.Version)" 

    # method 1: a MessageBox 
    [System.Windows.Forms.MessageBox]::Show($msg) | Out-Null 
    # method 2: Write-Host 
    Write-Host $msg 
    # method 3: navigate to a web page with EnvDTE 
    $project.DTE.ItemOperations.Navigate("some-url.html", [EnvDTE.vsNavigateOptions]::vsNavigateOptionsNewWindow) | Out-Null 
    # method 4: show a message in the Debug/Build window 
    $win = $project.DTE.Windows.Item([EnvDTE.Constants]::vsWindowKindOutput) 
    $win.Object.OutputWindowPanes.Item("Build").OutputString("Update available"); 
    $win.Object.OutputWindowPanes.Item("Build").OutputString([Environment]::NewLine) 
} 
0
  1. Realmente no hay nada malo en ello ...
  2. Usted puede utilizar Write-Host para empujarlo a la consola del gestor de paquetes.
3

Tengo una solución de monitoreo de .NET de código abierto llamado "Wolfpack" y uno de los plugins permita monitorizar para cambios a uno o más paquetes NuGet. También puede rastrear a través de múltiples alimentaciones también.

Puede ser un poco exagerado pero hará el trabajo. También puede recibir notificaciones por correo electrónico, gruñir o hacer rodar su propio mecanismo de notificación.

Las instrucciones para este complemento están aquí: http://wolfpackcontrib.codeplex.com/wikipage?title=WolfPack.Contrib.Checks.NuGet&referringTitle=Home

Cuestiones relacionadas