Hay muchas manera de actualizar la aplicación Electron. La manera más fácil y apoyada oficialmente es aprovechar el marco de trabajo incorporado Squirrel y el módulo autoUpdater de Electron.
El equipo de Electron mantiene update.electronjs.org, un webservice gratis y open-source que las aplicaciones Electron puede usar para auto-actualizarse. El servicio está diseñado para aplicaciones de Electron que cumplen con los siguientes criterios:
- Aplicaciones que se ejecuten en macOS o Windows
- La Aplicación tiene un repositorio público en GitHub
- Todas las compilaciones se publicarán en GitHub
- Todas las compilaciones tienen verificación de código
La forma más fácil de usar este servicio es instalando update-electron-app, un módulo de Node.js preconfigurado para usarse con update.electronjs.org.
Instala el módulo:
npm install update-electron-app
Invoque el actualizador de archivos de los principales procesos de su aplicacion Electrón:
require('update-electron-app')()
De manera predeterminada, este módulo verificará si existen actualizaciones en el inicio de la aplicación y luego cada diez minutos. Cuando se encuentra una actualización, esta se descargará automáticamente en segundo plano. Cuando se completa la descarga, se muestra un cuadro de diálogo que le permite al usuario reiniciar su aplicación.
Si necesita personalizar su configuración, puede usar la opción de update-electron-app
o usar el servicio de actualización directo.
Si está desarrollando una aplicación privada de Electrón, o si no está publicando lanzamientos en GitHub, tal vez pueda considerar poseer su propio servidor de actualizaciones.
Dependiendo de sus necesidades, puede escoger una de esta:
- Hazel – Update server for private or open-source apps which can be deployed for free on Vercel. Es tomado de los Lanzamientos de GitHub y aprovecha al maximo el poder de las CDN's de GitHub.
- Nuts – También usa los Lanzamientos de GitHub, pero almacena la aplicación, actualiza en el Disco Duro y también soporta repositorios privados.
- electron-release-server – proporciona un panel para administrar los lanzamientos y no es necesarios que los lanzamientos se originen desde GitHub.
- Nucleus – Un servidor de actualizaciones completo para aplicaciones de Electrón y es mantenido gracias a Atlassian. Soporta múltiples aplicaciones y canales, y utiliza un almacén de archivos estáticos para minimizar el coste del servidor.
Una vez que haya implementado su servidor de actualización, continúe con la importación de los módulos requeridos en su código. El siguiente código podría variar en diferentes servidores de software, pero funciona como está descrito cuando se utiliza Hazel.
Importantante: por favor asegurate de que el siguiente código solo se ejecutara en su paquete de aplicaciones, y no en desarrollo. Puedes usar electron-is-dev para chequear el tipo de ambiente.
const { app, autoUpdater, dialog } = require('electron')
A continuación, construya la URL de uno de los servidores de actualizaciones, de la siguiente manera: autoUpdater:
const server = 'https://your-deployment-url.com/'
const url = `${server}/update/${process.platform}/${app.getVersion()}`
autoUpdater.setFeedURL({ url })
As the final step, check for updates. The example below will check every minute:
setInterval(() => {
autoUpdater.checkForUpdates()
}, 60000)
Una vez que su aplicacion es empaquetada, usted recibirá una actualización para cada nuevo Lanzamiento de GitHub que usted publique.
Ahora que ha configurado el mecanismo de actualización básico para su aplicación, debe asegurarse de que el usuario reciba una notificación cuando haya una actualización. Esto se puede lograr utilzando la API de autoUpdater events:
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Restart', 'Later'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail: 'A new version has been downloaded. Restart the application to apply the updates.'
}
dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
})
Also make sure that errors are being handled. Here's an example for logging them to stderr
:
autoUpdater.on('error', message => {
console.error('There was a problem updating the application')
console.error(message)
})
Because the requests made by Auto Update aren't under your direct control, you may find situations that are difficult to handle (such as if the update server is behind authentication). The url
field does support files, which means that with some effort, you can sidestep the server-communication aspect of the process. Here's an example of how this could work.