web-dev-qa-db-fra.com

Configuration de la mise à jour automatique Electron avec son propre serveur (fournisseur générique)

J'ai mon propre serveur sur lequel j'ai téléchargé le programme d'installation de l'application via FTP. Son nom est quickmargo Setup 1.0.0.exe Et il est disponible sur

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

Aussi via FTP, j'ai téléchargé latest.yml Dans le même répertoire et il est disponible sur

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

Dans mon projet dans index.js j'ai

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()
    }
});

Dans package.json j'ai "version": "1.0.0", Et à l'intérieur build:{} J'ai:

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

(Je me fiche des autres plateformes)

Supposons maintenant que j'ai apporté des modifications à mon application et que je souhaite télécharger la version 1.0.1 et que mon application se mette à jour automatiquement si quelqu'un a déjà téléchargé le programme d'installation et installé mon application sur sa machine.

Dites-moi s'il vous plaît si tout ce que j'ai fait jusqu'à présent va bien et quelle est la prochaine étape. J'envisage de suivre:

  • changez version en 1.0.1 dans package.json
  • exécuter à nouveau la commande de génération dans le terminal
  • télécharger manuellement un nouvel installateur au même endroit sur mon serveur

Modifier

J'ai fait ci-dessus trois étapes et j'ai également téléchargé le nouveau latest.yml (avec la version 1.0.1) et le résultat est que lorsque j'exécute maintenant la version 1.0.0 précédemment installée (avant de télécharger la nouvelle version sur le serveur) sur un autre PC, il ne le fait pas détecter que j'ai ajouté 1.0.1 au serveur et qu'il ne met pas à jour ou n'affiche pas de popup ou quoi que ce soit. Qu'est-ce que je fais mal?

Modifier 2

J'essaie de le résoudre par moi-même et maintenant j'ai téléchargé 1.0.2 alors maintenant le lien vers l'application de téléchargement est:

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

Modifier 3

J'essayais de le résoudre par moi-même, j'ai édité le code dans index.js. J'ai également édité ci-dessus. alert('Update required!'); on update-available l'événement ne se produit jamais. Il devrait me montrer la fenêtre de message d'erreur que l'alerte n'est pas définie. Mais l'événement apparemment disponible pour la mise à jour n'est jamais émis.


Information additionnelle:

  • Mon application a été générée avec vue-electronv1.0.6 Passe-partout.
  • Ma version de mise à jour des électrons est 4.1.2
  • npm run build Invoque en fait du code depuis le passe-partout qui est dans .electron-vue/build.js Vous pouvez voir ce fichier dans le lien ci-dessus (par exemple, il a mis NODE_ENV en production. Le script dans package.json est: "build": "node .electron-vue/build.js && electron-builder",.
  • Je ne veux pas héberger de versions sur github parce que mon référentiel est privé et j'ai vu quelques informations dans electron.build docs que je ne devrais pas faire ça.
  • J'ai également vu des informations dans un problème que je pouvais créer un nouveau référentiel uniquement pour les versions, mais je considère que tout héberger sur mon propre serveur est une approche plus propre.
8
dopeCode

J'ai pu mettre en place une configuration de mise à jour automatique en utilisant une option de publication generic suivant les documents, je ne l'avais jamais fait auparavant. C'est donc définitivement faisable, et cela ne nécessite pas de signature via un certificat, mais j'ai d'abord eu des problèmes parce que j'avais défini publisherName dans la configuration de construction, mais pas de certificat. Si la version actuelle avait un éditeur ou un certificat spécifié et que la nouvelle ne le fait pas, elle ne sera pas non plus installée.

1. Activer la journalisation

Vous pouvez activer la journalisation du package electron-updater En installant également electron-log, Puis en affectant l'enregistreur à autoUpdater:

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

Les chemins de sortie par défaut sont:

  • Linux:~/.config/<app name>/log.log
  • macOS:~/Library/Logs/<app name>/log.log
  • Windows:%USERPROFILE%\AppData\Roaming\<app name>\log.log

Si les étapes suivantes ne résolvent pas vos problèmes, veuillez publier le contenu du journal.

2. N'appelez pas autoUpdater.setFeedURL()

Les documents officiels indiquent:

N'appelez pas setFeedURL . électron-builder crée automatiquement le fichier app-update.yml pour vous lors de la construction dans le resources (ce fichier est interne, vous n'avez pas besoin de le savoir).

L'URL est déjà définie dans votre objet fournisseur publish et cela suffit pour que le programme de mise à jour fonctionne. De plus, une chaîne d'URL comme argument de setFeedURL() est incorrecte, ce devrait être un objet d'options . Mais encore une fois, tout spécifier dans votre fournisseur publish est suffisant.

3. Téléchargez également les fichiers .blockmap Sur votre serveur

Ceux-ci doivent être créés lors de la construction en plus de vos fichiers de configuration .exe. Sinon, vous verrez des erreurs dans votre journal indiquant que les fichiers de l'ancienne et de la nouvelle version sont introuvables pour comparaison.

4. Ajoutez une barre oblique finale à l'URL de votre serveur de mise à jour

Assurez-vous que le paramètre url de votre objet fournisseur se termine par une barre oblique. Bien que le fichier yml puisse toujours être trouvé sans lui, il peut y avoir des problèmes lors du téléchargement proprement dit.

5. Essayez l'approche plus simple en utilisant autoUpdater.checkForUpdatesAndNotify()

Au lieu d'utiliser la manière la plus flexible, mais aussi la plus compliquée, d'écouter les différents événements de mise à jour et de réagir à ceux-ci dans votre application, essayez de la faire fonctionner d'abord avec le code suivant. Une fois que cela fonctionne, vous pouvez toujours recommencer à gérer les différents événements pour une meilleure expérience utilisateur.

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

Cela vérifiera et téléchargera la mise à jour en arrière-plan et l'installera automatiquement dès que vous fermerez votre application. Une notification Windows par défaut apparaîtra pour vous informer de la mise à jour disponible et de la procédure.

8
Constantin Groß