Aller au contenu principal

Mise à jour d'une application

There are several ways to provide automatic updates to your Electron application. The easiest and officially supported one is taking advantage of the built-in Squirrel framework and Electron's autoUpdater module.

Utilisation de update.electronjs.org

The Electron team maintains update.electronjs.org, a free and open-source webservice that Electron apps can use to self-update. Ce service est conçu pour les applications Electron répondant aux critères suivant:

  • L'application tourne sous macOs ou Windows
  • L'application a un répertoire GitHub public
  • Builds are published to GitHub Releases
  • Builds are code-signed

La façon la plus simple d'utiliser ce service est d'installer update-electron-app, un module Node.js pré-configuré pour être utilisé avec update.electronjs.org.

Install the module using your Node.js package manager of choice:

npm install update-electron-app

Then, invoke the updater from your app's main process file:

main.js
require('update-electron-app')()

Par défaut, ce module vérifiera les mises à jour au démarrage de l'application, toutes les dix- minutes. Lorsqu’une mise à jour est trouvée, elle sera automatiquement téléchargée en arrière-plan. When the download completes, a dialog is displayed allowing the user to restart the app.

If you need to customize your configuration, you can pass options to update-electron-app or use the update service directly.

Using other update services

Si vous développez une application Electron privée, ou si vous ne publiez pas votre application sous GitHub, il peut être nécessaire de mettre en place votre propre serveur de mise à jour.

Step 1: Deploying an update server

Selon vos besoins, vous pouvez choisir parmi l'un d'entre eux :

  • Hazel - Serveur de mise à jour pour les applications privées ou open source qui peuvent être déployées gratuitement sur Vercel. Cela récupère les releases GitHub et exploite la puissance du CDN de GitHub.
  • Nuts – Utilise aussi les releases GitHub, mais met en cache les mises à jour des applications sur le disque et prend en charge les dépôts privés.
  • electron-release-server – Fournit un tableau de bord pour la gestion des releases et n'exige pas que les releases soient créés sur GitHub.
  • Nucleus – Un serveur de mise à jour complet pour les applications Electron maintenues par Atlassian. Prend en charge plusieurs applications et canaux; utilise un magasin de fichiers statique pour minimiser le coût du serveur.

Once you've deployed your update server, you can instrument your app code to receive and apply the updates with Electron's [autoUpdater] module.

Step 2: Receiving updates in your app

First, import the required modules in your main process code. The following code might vary for different server software, but it works like described when using Hazel.

Check your execution environment!

Please ensure that the code below will only be executed in your packaged app, and not in development. You can use the app.isPackaged API to check the environment.

main.js
const { app, autoUpdater, dialog } = require('electron')

Next, construct the URL of the update server feed and tell autoUpdater about it:

main.js
const server = 'https://your-deployment-url.com'
const url = `${server}/update/${process.platform}/${app.getVersion()}`

autoUpdater.setFeedURL({ url })

Comme dernière étape, vérifiez les mises à jour. L'exemple ci-dessous vérifiera chaque minute:

main.js
setInterval(() => {
autoUpdater.checkForUpdates()
}, 60000)

Une fois que votre application est empaquetée, elle recevra une mise à jour pour chaque nouvelle version GitHub que vous publierez.

Step 3: Notifying users when updates are available

Maintenant que vous avez configuré le mécanisme de mise à jour de base de votre application, vous devez vous assurer que l’utilisateur sera notifié quand il y a une mise à jour. This can be achieved using the autoUpdater API events:

main.js
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()
})
})

Assurez-vous également que les erreurs sont gérées. Voici un exemple pour les renvoyer sur stderr:

main.js
autoUpdater.on('error', (message) => {
console.error('There was a problem updating the application')
console.error(message)
})
Handling updates manually

Because the requests made by autoUpdate 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 supports the file:// protocol, which means that with some effort, you can sidestep the server-communication aspect of the process by loading your update from a local directory. Here's an example of how this could work.