Saltar al contenido principal

Desde Squirrel

Applies to
Windows
MacOS
Linux

Migra desde Squirrel.Windows o Clowd.Squirrel a Velopack.

Estos son los pasos generales necesarios:

  1. Reemplaza el paquete nuget Squirrel.Windows o Clowd.Squirrel con el último Paquete NuGet de Velopack.

  2. Instala la herramienta de línea de comandos vpk, ya que es la que usarás para compilar versiones de Velopack.

    dotnet tool install -g vpk
    tip

    Asegúrate de usar la misma versión de vpk y del paquete de Velopack; esta es la única configuración oficialmente compatible.

    Alternativamente, puedes ejecutar vpk sin instalarlo globalmente usando el comando dnx:

    dnx vpk --version 1.0.0

    Reemplaza 1.0.0 con la versión del paquete de Velopack que estás usando en tu aplicación.

  3. Necesitarás reemplazar Squirrel.SquirrelAwareApp al comienzo de tu aplicación por Velopack.VelopackApp.Build().Run().

    Los accesos directos [Leer más] y las entradas del registro se gestionan automáticamente en Velopack, por lo que si actualmente lo estás haciendo en los hooks de SquirrelAwareApp, deben eliminarse. Por ejemplo, si tus hooks eran así antes:

    public static void Main(string[] args)
    {
    SquirrelAwareApp.HandleEvents(
    onInitialInstall: OnAppInstall,
    onAppUninstall: OnAppUninstall,
    onEveryRun: OnAppRun);
    }

    private static void OnAppInstall(SemanticVersion version, IAppTools tools)
    {
    tools.CreateShortcutForThisExe(ShortcutLocation.StartMenu | ShortcutLocation.Desktop);
    }

    private static void OnAppUninstall(SemanticVersion version, IAppTools tools)
    {
    tools.RemoveShortcutForThisExe(ShortcutLocation.StartMenu | ShortcutLocation.Desktop);
    }

    private static void OnAppRun(SemanticVersion version, IAppTools tools, bool firstRun)
    {
    if (firstRun) MessageBox.Show("Thanks for installing my application!");
    }

    Luego migrarías al siguiente código, eliminando los hooks de accesos directos:

    public static void Main(string[] args)
    {
    // Thank the user for installing the app on first run.
    // Note that the MessageBox class below comes from WinForms or WPF.
    VelopackApp.Build()
    .OnFirstRun(v => MessageBox.Show("Thanks for installing my application!"))
    .Run();
    }
  4. Los hooks de Velopack ya no admiten la creación manual de accesos directos. En su lugar, estos se crean/eliminan automáticamente como parte del instalador.

  5. Velopack requiere que la aplicación se reinicie para aplicar las actualizaciones. Las API anteriores aplicaban las actualizaciones descargadas antes de desencadenar el reinicio.

  6. El concepto de SquirrelAwareApp ya no existe, por lo que si has añadido atributos, entradas en el manifiesto del ensamblado u otros archivos para indicar que tu binario es «consciente», puedes eliminarlos. Cada paquete de Velopack tiene exactamente un binario "VelopackApp", que debe implementar el código anterior al comienzo de Main. De forma predeterminada, Velopack buscará un binario en {packDir}\{packId}.exe. Si tu exe principal de VelopackApp tiene un nombre diferente, debes proporcionarlo con el argumento --mainExe yourApp.exe.

  7. El archivo "RELEASES" ya no es un formato que usa Velopack, pero se generará uno al compilar paquetes en Windows con el canal predeterminado (es decir, sin argumento de canal). En su lugar, Velopack producirá archivos releases.{channel}.json, que deben tratarse de la misma manera. Si deseas que una aplicación de Windows heredada migre a Velopack, debes publicar una versión (omitiendo el argumento --channel) y subir tanto el archivo RELEASES como el archivo releases.win.json que produce Velopack a tu fuente de actualización.

  8. En general, la línea de comandos admite todas las mismas funciones, pero los nombres de los argumentos o comandos pueden haber cambiado. Velopack ya no admite el uso de un .nupkg creado por dotnet o nuget.exe. En su lugar, debes compilar/publicar tu aplicación y proporcionar la salida del compilador a vpk pack. Un ejemplo muy sencillo podría ser el siguiente

    dotnet publish --self-contained -r win-x64 -o publish
    vpk pack -u YourAppId -v 1.0.0 -p publish -e yourMainBinary.exe

    Consulta la ayuda de la línea de comandos de vpk para más detalles:

    vpk -h
  9. En tu aplicación instalada ya no existen carpetas app-1.0.0, y en una aplicación recién instalada no habrá un YourApp.exe en la raíz de la aplicación. Cambiar la ruta de la aplicación (p. ej., app-1.0.0 y app-1.0.1) como lo hace Squirrel es muy perjudicial, ya que rompe muchas cosas en Windows: reglas de firewall, problemas con antivirus, preferencias de GPU, anclaje de iconos en la bandeja del sistema y más. Mantener la ubicación del exe en la misma posición después de cada actualización soluciona muchos problemas, por lo que Velopack siempre almacenará tu programa en {root}\current\YourApp.exe. La primera vez que tu aplicación Squirrel descarga una actualización de Velopack, el actualizador de Velopack realizará una migración de la aplicación: buscará accesos directos en todas las ubicaciones habituales/predeterminadas y los limpiará/reparará para que apunten a la nueva ubicación. Si anteriormente tenías asociaciones de archivos o accesos directos fuera de las ubicaciones predeterminadas que apuntaban a {root}\YourApp.exe, estos deberán actualizarse, ya que ese archivo ya no existirá en las nuevas instalaciones.

Diferencias de API con Clowd.Squirrel

Esta lista no es exhaustiva y puede cambiar con el tiempo. Si tienes una pregunta específica, por favor pregunta en el Discord de Velopack. Para muchos de estos, una simple búsqueda/reemplazo en tu base de código debería ser suficiente; sin embargo, estas son solo pautas y debes revisar la referencia de la API de C# para conocer las firmas exactas y el comportamiento de las API de reemplazo.

  1. La clase ReleaseEntry es reemplazada por VelopackAsset
  2. UpdateManager ya no es desechable. Elimina cualquier declaración using.
  3. La propiedad UpdateManager.IsInstalledApp pasa a llamarse UpdateManager.IsInstalled
  4. El método UpdateManager.CheckForUpdate() pasa a llamarse UpdateManager.CheckForUpdatesAsync()
  5. UpdateInfo.CurrentlyInstalledVersion es reemplazado por la comprobación de UpdateInfo.BaseRelease
  6. UpdateInfo.ReleasesToApply ya no existe; dependiendo de tu uso, se reemplaza por UpdateInfo.TargetFullRelease o UpdateInfo.DeltasToTarget
  7. UpdateInfo.FutureReleaseEntry es reemplazado por UpdateInfo.TargetFullRelease
  8. UpdateInfo.Create() ya no existe, usa el constructor directamente new UpdateInfo()
  9. UpdateManager.DownloadReleases() es reemplazado por UpdateManager.DownloadUpdatesAsync()