Frage

Viele Programme beinhalten einen Auto-Updater, wo das Programm gelegentlich Online nach Updates sucht, und dann herunterlädt und wendet alle Updates, die gefunden werden. Programmfehler festgelegt sind, unterstützen Dateien geändert, und die Dinge sind (in der Regel) besser gemacht.

Leider, egal wie hart ich sehe, kann ich nicht Informationen zu diesem Prozess überall finden. Es scheint, wie der Auto-Updater, die wurden entweder proprietäre oder nicht als wichtig erachtet, umgesetzt wurden.

Es scheint ziemlich einfach, das System zu implementieren, die für Updates auf ein Netzwerk und lädt diese herunter schaut, wenn sie verfügbar sind. Der Teil des Auto-Updater wird der Implementierung erheblich von der Implementierung ändern. Die Frage ist, was sind die verschiedenen Ansätze von Anwenden Patches. Nur das Herunterladen von Dateien und alte durch neue zu ersetzen, ein Migrationsskript ausgeführt wird, die heruntergeladen wurde, Affen Teile des Systems Patching usw.? Konzepte werden bevorzugt, aber Beispiele in Java, C, Python, Ruby, Lisp, usw. würden geschätzt.

War es hilfreich?

Lösung

Ich denke, dass „sprachunabhängig“ wird ein limitierender Faktor, hier zu sein. Anwendungen kommen so viele verschiedene Formen und Größen in, dass es keine one-size-fits-all Antwort. Ich habe mehr Auto-Updater in mehreren Sprachen implementiert, und keine zwei ähnlich.

Die allgemeine Philosophie ist, dass die Anwendung überprüft mit einigen Heimatorts (Web-Adresse, Web-Abfrage, Firmennetzwerk Standort, etc.), um entweder zu fragen, ob es Version aktuell ist, oder fragen, was die aktuelle Version ist. Wenn die Antwort auf ein Update aufruft, wird dieser Prozess für jede Situation unterschiedlich sein.

Eine beliebte Alternative ist die Heimatorts einladen, ein Skript auszuführen, wenn die Anwendung gestartet wird. Das Skript kann die Version überprüfen, Updates herunterladen, wenn nötig, und für die Nutzung Feedback bitten, zum Beispiel.

Wir können wahrscheinlich besser helfen, wenn Sie die Parameter einzuengen.

UPDATE: Die Annäherung an „Patchen“ hängt auch von der Art der Anwendung, und es gibt eine sehr große Vielfalt hier. Wenn Sie eine einzelne ausführbare Datei, zum Beispiel haben, dann ist es wahrscheinlich am praktischsten die ausführbaren Datei zu ersetzen. Wenn Ihre Anwendung viele Dateien hat, sollten Sie nach Möglichkeiten suchen, die Anzahl der Dateien ersetzt zu minimieren. Wenn Ihre Anwendung sehr individuelle oder parametriert, sollten Sie versuchen, den Wieder Schneiderei Aufwand zu minimieren. Wenn Ihr Anwendungscode (wie eine Excel-VBA-Anwendung oder MS Access MDB-Anwendung) interpretiert beschäftigt, dann können Sie in der Lage sein, Teile des Codes zu ersetzen. In einer Java-Anwendung müssen Sie möglicherweise nur eine JAR-Datei oder auch eine Teilmenge der JAR-Inhalte ersetzen. Sie werden auch eine Möglichkeit haben müssen, um die aktuelle Client-Version zu erkennen und entsprechend aktualisieren. Ich könnte weiter und weiter gehen, aber ich hoffe, dass Sie meinen Punkt über die Vielfalt zu sehen. Dies ist einer der vielen Male, wenn die beste Antwort in der Regel beginnt mit „Nun, es kommt darauf an ...!“ Das ist, warum so viele Antworten wie „Bitte beachten Sie die Parameter einzuengen.“

Andere Tipps

Achten Sie darauf, auch die Auswirkungen auf die Sicherheit von Informationen über das Update Saugen zu betrachten, sowie die Update-Binärdateien selbst.

Vertrauen Sie die Quelle des Download? Sie telefonieren vielleicht zu Hause Ihr Update zu bekommen, aber was, wenn es ein Mann in der Mitte ist, die zu einem bösartigen Server umleitet. Eine HTTPS oder ähnlich sichere Verbindung wird helfen, aber doppelt so viele Bits überprüft, die Sie schließlich durch die Verwendung einer digitalen Signatur überprüfen herunterladen empfohlen.

Als erstes müssen Sie eine Datei auf Ihrer Anwendung zu Hause Website mit der neuesten Version. Der beste Weg, denke ich, für diese Aufgabe spezielle SQL-Tabelle zu haben, und füllen Sie sie automatisch nach neuer Version veröffentlicht / nächtlicher Abschluss bauen. Ihre Anwendung schafft neue Threads, http-Link mit versions eingebauten Anfragen und vergleicht mit Strom. In .NET Code verwenden verwenden können:

Version GetLatestVersion() {
HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(new Uri(new Uri(http://example.net), "version.txt));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (request.HaveResponse)
{
  StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.Default);
  return new Version(stream.ReadLine());
}
else
{
  return null;
}
}

Version latest = GetLatestVersion();
Version current = new Version(Application.ProductVersion);
if (current < latest)
{
  // you need an update
}
else
{
  // you are up-to-date
}

In diesem Beispiel version.php in nur eine Ebene String wie 1.0.1.0.

Ein weiterer Tipp, den ich geben kann - wie ein Update zum Download bereit. Ich mag sehr viel nächste Idee: in den Ressourcen der Anwendung gibt es eine Reihe von CLR-Code, mit dem Sie on-the-fly kompilieren (mit CodeDom) in einen temporären Ordner, Hauptanwendung ruft sie und geht zu schließen. Updater liest Argumente, Einstellungen oder Registry und lädt neue Module. Und ruft Hauptanwendung, die alle temporären Dateien löscht. Fertig!

(Aber hier ist alles über .NET)

Die einfachsten Lösungen (von vielen Programmen verwendet wird) wird das Deinstallationsprogramm für die vorherige Version ausgeführt wird und der das Installationsprogramm für die neue Lauf (optional Skipping Fragen, die der Benutzer bereits beantwortet hat, wie die EULA). Der einzige Haken ist, dass die neue Version der Lage sein muss, die Konfigurationsoptionen von der alten Version zu lesen.

Auch unter Windows können Sie nicht um eine ausführbare Datei löschen, die in Betrieb ist, so dass Sie wahrscheinlich eine kleine ausführbare Datei in Temp-Ordner, die den gesamten Prozess läuft fallen wollen und es dann am Ende löschen aus der Instanz die neue Version, die ins Leben gerufen wurde (oder nur es registriert gelöscht werden beim nächsten Neustart ).

Der einfachste Ansatz wäre Ihr Programm Abfrage eines Server (Website) zu haben, um zu sehen, ob es ein Update ist. Wenn es ein Update können Sie eine Nachricht an den Benutzer anzuzeigen, die sie auffordert, eine neuere Version zum Herunterladen und stellt eine Verbindung.

Eine alternative und komplexere Lösung wären, einen kleinen Windows-Dienst (oder Unix-Daemon), die in regelmäßigen Abständen, ob es überprüft, erstellen Updates sind, kann dieser Dienst das Update herunterladen und das Installationsprogramm starten.

Die allgemeine Architektur ist, dass Sie einen zentralen Server, die Sie steuern, dass die neueste Version kennen und wo es zu bekommen. Dann fragen die Programme auf den Server. Ich werde nicht Beispielcode enthalten, weil es sehr Beklagte auf dem Server und dem Format, das Sie wählen. Es ist nicht schrecklich schwierig though.

Dies ist nicht so sehr eine vollständige Antwort, sondern ein Beispiel für die automatische Aktualisierung Mechanismus implementiert ich vor kurzem. Die Situation ist ein wenig anders aus der Tradition Firefox-Art der Benutzeranwendung, da es ein internes Werkzeug bei der Arbeit verwendet wurde.

Im Grunde ist es ein kleines Skript, das eine Warteschlange von Subversion Zweigen verwaltet in einem Installer gebaut und verpackt werden. Es liest sich ein wenig Datei, wo die Namen der Zweige geschrieben werden, nimmt die erste, am Ende der Datei wieder schreibt, und startet den Build-Prozess, der eine Reihe von Skripten Aufruf beinhaltet. Die Konfiguration für jeden Zweig zu bauen in einer INI-Datei geschrieben, in einer Subversion-Repository gespeichert zusammen mit dem Werkzeug selbst.

Da dieses Programm auf mehreren Computern ausgeführt wird, wollte ich einen Weg, um es auf allen Maschinen automatisch zu aktualisieren, sobald ich eine Änderung entweder an das Werkzeug selbst oder auf die Konfigurationsskripts.

So wie ich es implementiert war einfach: Wenn ich das Tool starten, ist es eine „äußere Hülle“ wird. Diese Außenhülle hat zwei sehr einfache Dinge:

  • svn update auf sich selbst und auf die Konfigurationsdateien
  • starten sich wieder, diesmal als „innere Schale“, die eine, die tatsächlich eine Konfiguration behandelt (und beendet dann wieder).

Dieses sehr einfache Update-mich-in-a-Loop-System hat uns für ein paar Monate jetzt sehr gut bedient. Es ist sehr elegant, weil es in sich geschlossen ist: das Auto-Updater das Programm selbst ist. Denn „äußere Hülle“ (der Auto-Updater Teil) so einfach ist, spielt es keine Rolle, dass es nicht von den Updates als „Innenschale“ zugute kommt (die jedes Mal aus der aktualisierten Quelle Datei ausgeführt).

Eine Sache, die nicht wirklich erwähnt wurde ist, dass Sie ernsthaft in Erwägung ziehen sollen, dass der Benutzer das Programm ausgeführt werden möglicherweise nicht tatsächlich über ausreichende Berechtigungen, um es zu aktualisieren. Dies sollte ziemlich häufig zumindest für Business-Anwender, wahrscheinlich weniger für Heimanwender.

Ich arbeite immer mit einem (selbst auferlegten) eingeschränkten Konto aus Sicherheitsgründen und es kotzt mich immer aus, dass die meist Auto-updaters einfach davon ausgehen, dass ich als Admin renne und dann nach dem Download einfach nicht und bieten keine andere Art und Weise das Update andere als das Programm tatsächlich Schließen der Durchführung und es wieder in einem Verwaltungskontext ausgeführt wird. Die meisten haben nicht einmal die heruntergeladene Update-Cache und es wieder von vorn zu tun haben.

Es wäre viel besser, wenn der Auto-Updater einfach für die Admin-Anmeldeinformationen auffordern würde, wenn nötig und wieder mit ihm.

Da Auto Aktualisierung ein gängiges Szenario ist, haben die meisten Sprachen mindestens ein Paket diese zur Verfügung zu unterstützen. (Im Folgenden werde ich einige der verfügbaren Pakete Liste)

Einer der wirklich nette Idee ist die Clickonce-Verteilung für .NET, es ist ein Installationsprogramm, das Ihre Anwendung und installiert Sandbox im Benutzerkontext, so dass keine Administratorrechte erforderlich. Sie können die Clickonce in Ihrem veröffentlichen konfigurieren für Updates jede Anwendung Start zu überprüfen.

Java hat Java Web starten, die die gleichen Angebote Art von Funktionalität für Java-Applets.

Delphi zahlreiche Artikel über die automatische Aktualisierung, hat Torry eine Liste der WebUpdate Komponenten , zum Beispiel goUpdater scheint ein sehr breites Spektrum an Funktionalität zu haben.

Sie alle nutzen eine Website / Netzwerkfreigabe für eine neue Version zu überprüfen und als abrufen entweder einen Patch oder eine komplette Datei installieren und ausführen. So sollten Sie versuchen, ein schönes Paket für Ihre Anwendung zu finden, die Ihnen den Aufwand für die Entwicklung und Pflege Ihrer eigene Lösung zu speichern.

In einer Java-Webstart Einstellung eine JNLP-Datei starten, die dann den Download der Jar-Dateien lösen notwendig, um die Anwendung auszuführen. Jedesmal webstart überprüft, ob es neuere Versionen der Gläser und würde downloaden sie die lokal zwischengespeichert zu ersetzen. Mit einem Tool namens jardiff Sie nur Diffs zu den neueren Gläsern schaffen und verteilen diese über den Server (z nur ein Update bekommen).

Vorteile:

  • immer auf dem neuesten Stand

Nachteile:

  • Sie benötigen einen Anwendungsserver (Tomcat, JBoss), um die Dateien
  • zu verteilen
  • Sie benötigen eine Internetverbindung, um die Anwendung zu erhalten

Reading Carl Seleborgs Antwort gab mir einige Ideen, wie eine generische Code-Repository nützlich sein könnte.

svn kommt mit einem Werkzeug svnsync genannt, die Art verhält sich der wie ein SVN-Export, sondern verfolgt die aktuellen Revision der Export bei ist.

Jemand könnte dieses System, um nur nutzen zu holen die geänderten Dateien von den Nutzern tatsächlich Revision.

In Wirklichkeit haben Sie ein Repository mit den Binärdateien kompiliert und svnsync läuft nur die Binärdateien abzurufen, die modifiziert wurde. Es könnte auch lokale Änderungen an textbasierten Konfigurationsdateien mit neuen Konfigurationsoptionen fusionieren kann.

Die Funktion gibt einen Patch, um ein Programm zu installieren ist im Grunde eine der grundlegenden Funktionen eines Installateurs. Installer-Software wird in zahlreichen Orten dokumentiert, aber in der Regel auf einer Pro-Installer Basis: Dort wird das Microsoft Installer (mit Installshield Extensions), Ruby-gems , Java .jar Dateien, die verschiedenen Linux-Paket-Manager-Systeme ( RPM , Apt-get ) und andere.

Dies alles sind komplexe Systeme, die das Problem der Patch-Programm im Allgemeinen, sondern für etwas anderen Systeme lösen. welche dieses System Ihrer Anwendung am meisten ähnelt, zu entscheiden, was für Sie am besten ist, in Betracht ziehen. Roll Ihre eigene ist in Ordnung, aber wenn man diesen Systemen ist ein Ort, zu starten.

Sie können ein internes Modul Ihrer Anwendung schreiben Updates zu tun. Sie können eine externe Mini-Anwendung schreiben Updates zu tun.

Schauen Sie auch auf .NET on-the-fly Kompilierung-Technologie macht es möglich, eine solche Mini-Anwendung zu erstellen, die auf Nachfrage on-the-fly. Zum Beispiel http://fly.sf.net/

Ich werde Antwort für Windows zu übernehmen.

Auf diese Weise scheint gut zu funktionieren.

In dem Installateur tun:
1. Erstellen Sie einen manuellen Start Dienst, der als Localsystem ausgeführt wird, dass beim Start funktioniert das Update stoppt dann.
2. Ändern Sie die Dienstberechtigungen, so dass alle Benutzer den Dienst starten können (wenn alle Benutzer sollten w / o Admin-Rechte aktualisieren können).
3. das Hauptprogramm ändern, um nach Updates zu suchen, wenn mit einem einfachen Mechanismus gestartet. Wenn es ein Update erkennt, veranlassen, wenn der Benutzer es anwenden will.
4. Wenn der Benutzer das Update akzeptiert, starten Sie den Dienst.

Wenn die Architektur für die es erlaubt, erstellen Sie einen Weg, um das Update zu überwachen, wie er ausgeführt wird.

Wenn Sie Ihre Software Open Source ist, und Ziel Linux oder Entwickler. Es ist interessant, die Software als git Repo zu installieren. Und nachdem er den stabilen Zweig gelegentlich oder jedes Mal ziehen, wenn es gestartet wird.

Dies ist besonders einfach, wenn Ihre Anwendung über npm, sbt, mavan, Stapel, Ulme-Paket oder gleich verwaltet wird.

Wenn Sie sich für eine plattformübergreifende Software-Update-Lösung suchen, werfen Sie einen Blick auf www.updatenode.com

Einige Highlights:

  • für Open-Source-Projekte
  • Cross-Plattform und Open-Source-Update-Client-Tool
  • lokalisierte bereits für die wichtigsten Sprachen
  • einfach zu integrieren und leicht zu handhaben
  • Cloud-basierte Management-Plattform zu definieren und verwalten Updates
  • zusätzlich zur Anzeige von Nachrichten (informiert über neue Veranstaltungen, Produkte, etc.).
  • unterstützt
  • Web-Interface ist offen
  • (Sie können Ihre eigene Client mit dem Dienst erstellen)
  • viele Nutzungsstatistiken, wie verwendeten Betriebssysteme, Geo Lage, Version Nutzung usw.
  • Android API für mobiles App-Updates

Probieren Sie es aus.

übrigens, ich bin ein Teil des Entwickler-Teams für das Open-Source-Client. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top