Configuración del actualizador automático de electrones con servidor propio (proveedor genérico)

8

Tengo mi propio servidor donde cargué el instalador de la aplicación a través de FTP. Su nombre es quickmargo Setup 1.0.0.exey está disponible en

https://quickmargo.pl/dist/download/quickmargo Setup 1.0.0.exe

También a través de FTP subí latest.ymlal mismo directorio y está disponible en

https://quickmargo.pl/dist/download/latest.yml

En mi proyecto en index.js tengo

import { autoUpdater } from 'electron-updater'

autoUpdater.setFeedURL('https://quickmargo.pl/dist/download');

autoUpdater.on('update-downloaded', () => {
    autoUpdater.quitAndInstall()
});

autoUpdater.on('update-available', (ev, info) => {
    alert('Update required!');
});

app.on('ready', async () => {
    if (process.env.NODE_ENV === 'production') {
        await autoUpdater.checkForUpdates()
    }
});

En package.json tengo "version": "1.0.0",y dentro build:{}tengo:

"win": {
  "icon": "build/icons/icon.ico",
  "publish": [{
    "provider": "generic",
    "url": "https://quickmargo.pl/dist/download"
  }]
},

(No me importan otras plataformas)

Ahora supongamos que he realizado algunos cambios en mi aplicación y quiero cargar la versión 1.0.1 y quiero que mi aplicación se actualice automáticamente si alguien ya descargó el instalador e instaló mi aplicación en su máquina.

Dime por favor si todo lo que hice hasta ahora está bien y cuál es el siguiente paso. Considero lo siguiente:

  • cambiar versiona 1.0.1en package.json
  • ejecutar el comando de compilación en la terminal nuevamente
  • cargar manualmente un nuevo instalador al mismo lugar en mi servidor

Editar

Hice los tres pasos anteriores y también cargué el último latest.yml (con la versión 1.0.1) y el resultado es que cuando ahora ejecuto la versión 1.0.0 instalada previamente (antes de cargar la nueva versión en el servidor) en otra PC, entonces no lo hace detecta que agregué 1.0.1 al servidor y no se actualiza ni muestra alguna ventana emergente ni nada. ¿Qué estoy haciendo mal?

Editar 2

Estoy tratando de resolverlo por mi cuenta y ahora cargué 1.0.2, así que ahora el enlace para descargar la aplicación es:

https://quickmargo.pl/dist/download/quickmargo Setup 1.0.2.exe

Editar 3

Estaba tratando de resolverlo por mi cuenta. Edité el código en index.js. Edité también arriba. alert('Update required!');en update-availablecaso de que nunca ocurra. Debería mostrarme la ventana de mensaje de error de que la alerta no está definida. Pero, aparentemente, el evento de actualización disponible nunca se emite.


Información adicional:

  • Mi aplicación se generó con la placa de v1.0.6 referencia vue-electron .
  • Mi versión de actualización electrónica es 4.1.2
  • npm run buildEn realidad invocar algún código de texto modelo que está en .electron-vue/build.js. se puede ver este archivo en el enlace de arriba (por ejemplo, se establece NODE_ENV a la producción de secuencias de comandos en package.json es: "build": "node .electron-vue/build.js && electron-builder",.
  • No quiero alojar lanzamientos en github porque mi repositorio es privado y vi cierta información en electron.build docs que no debería hacer eso.
  • También vi información en algún problema que podía crear un nuevo repositorio solo para lanzamientos, pero considero alojar todo en mi propio servidor como un enfoque más limpio.
dopeCode
fuente
Aquí hay un ejemplo: github.com/iffy/electron-updater-example que cubre actualizaciones "personalizadas"
Lawrence Cherone
Entonces, ¿qué hago mal?
dopeCode
Ejecute su aplicación empaquetada a través del cmd para ver los registros, tener estos en la pregunta puede ser útil
oktapodia
¿Necesito que la aplicación se firme con certificado para ejecutar la actualización automática correctamente?
dopeCode
@dopeCode no, la actualización automática debería funcionar sin la firma del código, si no ve ningún error después de iniciar su exe integrado en la terminal, use un registrador similar electron-logpara darle al autoUpdater un registrador para usar ( const logger = require("electron-log"); autoUpdater.logger = logger; logger.transports.file.level = "debug";); esto debería imprimir información si su se encontró el servidor y si se encontró una actualización. Si obtiene un error, puede agregarlo a su pregunta.
Rhayene

Respuestas:

9

Pude configurar una configuración de actualización automática usando una genericopción de publicación siguiendo los documentos, nunca antes lo había hecho. Por lo tanto, es definitivamente factible, y no requiere firma mediante un certificado, pero inicialmente tuve problemas porque había configurado publisherNamela configuración de compilación, pero no tenía certificado. Si la versión actual tenía un editor o certificado especificado, y la nueva no, tampoco se instalará.

1. Habilite el registro

Puede habilitar el registro del electron-updaterpaquete instalando también electron-logy luego asignando el registrador a autoUpdater:

const log = require('electron-log');
autoUpdater.logger = log;
autoUpdater.logger.transports.file.level = 'info';

Las rutas de salida predeterminadas son:

  • Linux: ~/.config/<app name>/log.log
  • Mac OS: ~/Library/Logs/<app name>/log.log
  • Ventanas: %USERPROFILE%\AppData\Roaming\<app name>\log.log

Si los siguientes pasos no resuelven sus problemas, publique el contenido del registro.

2. No llames autoUpdater.setFeedURL()

Los documentos oficiales dicen:

No llame a setFeedURL . electron-builder crea automáticamente el app-update.ymlarchivo para usted en la compilación en resources(este archivo es interno, no necesita estar al tanto).

La URL ya está definida en su publishobjeto de proveedor y eso es suficiente para que funcione el actualizador. Además, una cadena URL como argumento de setFeedURL()es incorrecta, debe ser un objeto de opciones . Pero nuevamente, publishes suficiente especificar todo en su proveedor.

3. También suba los .blockmaparchivos a su servidor

Estos deben crearse al compilar, además de sus .exearchivos de configuración . De lo contrario, verá errores en su registro de que los archivos de la versión anterior y la nueva no se pudieron encontrar para comparar.

4. Agregue una barra diagonal final a la URL de su servidor de actualización

Asegúrese de que el urlparámetro de su objeto proveedor termine con una barra inclinada. Si bien el archivo yml todavía se puede encontrar sin él, de lo contrario puede haber problemas durante la descarga real.

5. Pruebe el enfoque más simple usando autoUpdater.checkForUpdatesAndNotify()

En lugar de utilizar la forma más flexible, pero también más complicada, de escuchar los diferentes eventos de actualización y reaccionar ante ellos dentro de su aplicación, primero intente que funcione con el siguiente código. Una vez que eso funcione, aún puede volver a manejar los diferentes eventos para una mejor experiencia de usuario.

app.on('ready', async () => {
  autoUpdater.checkForUpdatesAndNotify();
});

Esto buscará y descargará la actualización en segundo plano y la instalará automáticamente tan pronto como cierre su aplicación. Aparecerá una notificación predeterminada de Windows para informarle sobre la actualización disponible y el procedimiento.

Constantin Groß
fuente
Agregué el registrador y ahora veo que realmente encuentra una nueva versión, incluso muestra cuántos kb deben descargarse: Full: 151,317.35 KB, To download: 1,152.69 KB (1%) pero después de eso no sucede nada. La aplicación no se está actualizando. ¿Está seguro de que checkForUpdatesAndNotifyes suficiente para cerrar la aplicación si encuentra una nueva versión, luego descargue la nueva versión e instálela?
dopeCode
Bueno, agregué estos oyentes nuevamente y update-availableencendí algo de texto que puedo ver pero update-downloadednunca se emite, ya que no puedo ver el inicio de sesión en este evento. ¿Cuál podría ser la razón por la que no comienza / termina (tbh ni siquiera sé cuál) descargar?
dopeCode
checkForUpdatesAndNotifydebería mostrar una notificación una vez que la descarga se realizó correctamente y luego la aplicación debería actualizarse una vez que la cierre. Pero si el update-downloadedevento nunca se dispara, no llegarás tan lejos. Sin embargo, es difícil para mí decir qué está causando el problema.
Constantin Groß
Sí, ese es básicamente mi comportamiento update-availablese emite pero update-downloadedno se emite . No sé por qué todavía. Intentaré reproducirlo en un nuevo repositorio de emty.
dopeCode
Yhm ahora empezó a funcionar. Aunque no cambié una sola línea de código. Esperé como un día, durante ese tiempo también reinicié la PC. Está funcionando pero está descargando la aplicación completa y registra un error: Cannot download differentially, fallback to full download: Error: Received data length 1527 is not equal to expected 634.también intenta actualizarse después de salir de la aplicación y solicitar permiso de administrador. Y si no lo permito, puedo volver a ejecutar la aplicación con la versión anterior, que es un comportamiento que no quiero. Quiero obligar a los usuarios a instalar la actualización. Estoy usando autoUpdater.quitAndInstall () pero no se está cerrando.
dopeCode