Elektronisches automatisches Updater-Setup mit eigenem Server (generischer Anbieter)

8

Ich habe meinen eigenen Server, auf dem ich das App-Installationsprogramm über FTP hochgeladen habe. Sein Name ist quickmargo Setup 1.0.0.exeund es ist verfügbar bei

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

Auch über FTP habe ich latest.ymlin dasselbe Verzeichnis hochgeladen und es ist verfügbar unter

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

In meinem Projekt in index.js habe ich

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

In package.json habe ich "version": "1.0.0",und drinnen habe build:{}ich:

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

(Andere Plattformen interessieren mich nicht)

Nehmen wir jetzt an, ich habe einige Änderungen an meiner App vorgenommen und möchte Version 1.0.1 hochladen. Ich möchte, dass meine App automatisch aktualisiert wird, wenn jemand das Installationsprogramm bereits heruntergeladen und meine App auf seinem Computer installiert hat.

Sagen Sie mir bitte, ob alles, was ich bisher gemacht habe, in Ordnung ist und was der nächste Schritt ist. Ich betrachte Folgendes:

  • Wechseln Sie versionzu 1.0.1in package.json
  • Führen Sie den Befehl build erneut im Terminal aus
  • Laden Sie das neue Installationsprogramm manuell an denselben Ort auf meinem Server hoch

Bearbeiten

Ich habe die oben genannten drei Schritte ausgeführt und außerdem die neueste Datei "latest.yml" (mit Version 1.0.1) hochgeladen. Wenn ich jetzt die zuvor installierte Version 1.0.0 (vor dem Hochladen einer neuen Version auf den Server) auf einem anderen PC ausführe, ist dies nicht der Fall Stellen Sie fest, dass ich 1.0.1 zum Server hinzugefügt habe und dieser kein Popup oder ähnliches aktualisiert oder anzeigt. Was mache ich falsch?

Bearbeiten 2

Ich versuche es selbst zu lösen und jetzt habe ich 1.0.2 hochgeladen. Der Link zum Herunterladen der App lautet also:

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

Bearbeiten 3

Ich habe versucht, es selbst zu lösen. Ich habe den Code in index.js bearbeitet. Ich habe auch oben bearbeitet. alert('Update required!');im update-availableEreignis nie auftreten. Es sollte mir ein Fehlermeldungsfenster zeigen, dass die Warnung undefiniert ist. Aber anscheinend wird ein Update-verfügbares Ereignis niemals ausgegeben.


Zusätzliche Information:

  • Meine App wurde mit Vue-Electron v1.0.6 Boilerplate generiert .
  • Meine Elektronen-Updater-Version ist 4.1.2
  • npm run build.electron-vue/build.jsRufen Sie tatsächlich einen Code von Boilerplate auf, in dem Sie diese Datei im obigen Link sehen können (zum Beispiel setzt sie NODE_ENV auf Produktion. Das Skript in package.json lautet : "build": "node .electron-vue/build.js && electron-builder",.
  • Ich möchte keine Releases bei github hosten, da mein Repository privat ist und ich in elektron.build-Dokumenten einige Informationen gesehen habe , die ich nicht tun sollte.
  • Ich habe in einigen Ausgaben auch Informationen gesehen, dass ich nur für Releases ein neues Repo erstellen könnte, aber ich betrachte das Hosten von allem auf meinem eigenen Server als saubereren Ansatz.
dopeCode
quelle
Hier gibt es ein Beispiel: github.com/iffy/electron-updater-example, das "benutzerdefinierte" Updates behandelt
Lawrence Cherone
Also, was mache ich falsch?
DopeCode
Führen Sie Ihre gepackte App über das Cmd aus, um die Protokolle
anzuzeigen.
Muss die Anwendung mit einem Zertifikat signiert sein, damit die automatische Aktualisierung korrekt ausgeführt werden kann?
DopeCode
@dopeCode nein, autoupdate sollte ohne Codesignatur funktionieren. Wenn Sie nach dem Starten Ihrer erstellten Exe im Terminal keinen Fehler sehen, verwenden Sie einen Logger electron-log, der dem autoUpdater einen Logger zur Verwendung gibt ( const logger = require("electron-log"); autoUpdater.logger = logger; logger.transports.file.level = "debug";). Dies sollte Informationen ausdrucken, wenn Ihre Server wurde gefunden und ob ein Update gefunden wurde. Wenn Sie eine Fehlermeldung erhalten, können Sie diese Ihrer Frage hinzufügen.
Rhayene

Antworten:

9

Ich konnte eine automatische Update-Konfiguration mithilfe einer genericVeröffentlichungsoption einrichten, die den Dokumenten folgt, nachdem ich dies noch nie zuvor getan hatte. Es ist also definitiv machbar und erfordert keine Signatur über ein Zertifikat, aber ich hatte anfangs Probleme, weil ich publisherNamein der Build-Konfiguration festgelegt hatte, aber kein Zertifikat. Wenn in der aktuellen Version ein Herausgeber oder Zertifikat angegeben wurde und in der neuen nicht, wird es auch nicht installiert.

1. Aktivieren Sie die Protokollierung

Sie können die Protokollierung des electron-updaterPakets aktivieren, electron-logindem Sie den Logger installieren und dann dem folgenden zuweisen autoUpdater:

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

Die Standardausgabepfade sind:

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

Wenn die folgenden Schritte Ihre Probleme nicht lösen, veröffentlichen Sie bitte den Protokollinhalt.

2. Rufen Sie nicht an autoUpdater.setFeedURL()

In den offiziellen Dokumenten heißt es :

Rufen Sie setFeedURL nicht auf . Electron-Builder erstellt app-update.ymlbeim Erstellen in automatisch eine Datei für Sie resources(diese Datei ist intern, Sie müssen sich dessen nicht bewusst sein).

Die URL ist bereits in Ihrem publishProvider-Objekt definiert und reicht aus, damit der Updater damit arbeiten kann. Auch eine URL-Zeichenfolge als Argument von setFeedURL()ist falsch, es sollte sich um ein Optionsobjekt handeln . Aber auch hier publishist es ausreichend , alles in Ihrem Provider anzugeben .

3. Laden Sie die .blockmapDateien auch auf Ihren Server hoch

Diese sollten zusätzlich zu Ihren Setup- .exeDateien beim Erstellen erstellt werden . Andernfalls werden in Ihrem Protokoll Fehler angezeigt, dass die Dateien der alten und der neuen Version nicht zum Vergleich gefunden wurden.

4. Fügen Sie Ihrer Update-Server-URL einen abschließenden Schrägstrich hinzu

Stellen Sie sicher, dass der urlParameter Ihres Provider-Objekts mit einem Schrägstrich endet. Während die yml-Datei möglicherweise immer noch ohne sie gefunden wird, kann es ansonsten zu Problemen beim eigentlichen Download kommen.

5. Versuchen Sie es mit dem einfacheren Ansatz autoUpdater.checkForUpdatesAndNotify()

Anstatt die flexiblere, aber auch kompliziertere Methode zu verwenden, um die verschiedenen Aktualisierungsereignisse abzuhören und in Ihrer App darauf zu reagieren, versuchen Sie zunächst, sie mit dem folgenden Code zum Laufen zu bringen. Sobald dies funktioniert, können Sie zur besseren Benutzererfahrung immer noch die verschiedenen Ereignisse behandeln.

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

Dadurch wird das Update im Hintergrund überprüft, heruntergeladen und automatisch installiert, sobald Sie Ihre App schließen. Eine Standard-Windows-Benachrichtigung wird angezeigt, um Sie über das verfügbare Update und die Vorgehensweise zu informieren.

Constantin Groß
quelle
Ich habe Logger hinzugefügt und jetzt sehe ich, dass es tatsächlich eine neue Version findet. Es zeigt sogar, wie viele KB heruntergeladen werden müssen Full: 151,317.35 KB, To download: 1,152.69 KB (1%) . Danach passiert jedoch nichts mehr. Die App wird nicht aktualisiert. Sind Sie sicher, dass dies checkForUpdatesAndNotifyausreicht, um die App zu beenden, wenn sie eine neue Version gefunden hat? Laden Sie dann die neue Version herunter und installieren Sie sie?
DopeCode
Nun, ich habe diese Listener wieder hinzugefügt und update-availableprotokolliere einen Text, den ich sehen kann, der aber update-downloadednie ausgegeben wird, da ich bei diesem Ereignis kein Protokoll sehen kann. Was könnte der Grund dafür sein, dass das Herunterladen nicht gestartet / beendet wird (obwohl ich nicht einmal weiß, welches)?
DopeCode
checkForUpdatesAndNotifysollte eine Benachrichtigung anzeigen, sobald der Download erfolgreich war, und die App sollte aktualisiert werden, sobald Sie sie schließen. Aber wenn das update-downloadedEreignis nie ausgelöst wird, kommen Sie nicht so weit. Es fällt mir jedoch schwer zu sagen, was das Problem verursacht.
Constantin Groß
Ja, das ist im Grunde genommen mein Verhalten update-available, aber update-downloadednicht. Ich weiß noch nicht warum. Ich werde versuchen, es neues, leeres Repository zu reproduzieren.
DopeCode
Yhm jetzt fing es an zu arbeiten. Obwohl ich keine einzelne Codezeile geändert habe. Ich habe nur wie ein Tag gewartet, während dieser Zeit auch den PC neu gestartet. Es funktioniert, aber es lädt die vollständige App herunter und es protokolliert einen Fehler: Cannot download differentially, fallback to full download: Error: Received data length 1527 is not equal to expected 634.Außerdem wird versucht, nach dem Beenden der App zu aktualisieren und um Administratorrechte zu bitten. Und wenn ich es nicht zulasse, kann ich die App mit der vorherigen Version erneut ausführen. Dies ist ein Verhalten, das ich nicht möchte. Ich möchte Benutzer zwingen, das Update zu installieren. Ich verwende autoUpdater.quitAndInstall (), aber es wird nicht beendet.
DopeCode