nUpdate Tutorial

    • Allgemein
    • .NET (FX) 4.5–4.8

    Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      nUpdate Tutorial

      Salut,

      hier schreibe ich mal ein Tutorial über nUpdate, das Updatesystem von @Trade, das mittlerweile eine sehr gute Alternative zum Updatesystem.NET darstellt, da es alles wichtige, was man auch von dort kannte, mitbringt und viele neue Features anbietet. Es wird z. Z. noch weiterentwickelt und bald gibt es auch coole Features wie Delta Patching, Differentialupdates usw.
      Dann wollen wir mal anfangen :)

      Wieso nUpdate?


      Viele Benutzer werden sich jetzt wohl fragen: Wieso soll ich soetwas nutzen, statt einer einfachen Textdatei auf einem FTP-Server, welche einfach die aktuelle Versionsnummer und ein Link zu dieser enthält. Was diese Nutzer nicht wissen: Ihr seid schuld, wenn dieses Update einen Virus bzw. Malware installiert, ganz egal, ob ihr etwas dafür könnt oder nicht. Angenommen jemand kapert euren Server und ersetzt einfach die Updatedatei durch seinen Trojaner. Dann werdet ihr zur Verantwortung gezogen - und das kann teuer werden. Es gibt noch eine weitere Möglichkeit, diese Lücke auszunutzen, das ARP-Spoofing, aber detailliert steht da mehr dazu hier. Da viele Updater auch auf FTP-only setzen: Das ist ebenso eine große Schwachstelle, denn FTP ist unsicher, da es keine Verschlüsselung bietet und zudem müssen die Credentials ja für FTP irgendwo mitgeliefert sein. Auch der Aspekt, dass jemand anderes somit Zugriff auf eueren Server bekommt ist natürlich unschön, also gleich wieder vergessen. Genau dafür existiert als Protokoll HTTP(S). Um auf die Pakete zurückzukommen: nUpdate signiert diese Updatepakete. Dies bedeutet, dass selbst wenn der Angreifer euren Webspace kapern sollte, er die Updatepakete ohne eure "Unterschrift" (signieren = Unterschreiben) nicht austauschen kann. Dafür sorgt ein 8192 Bit RSA-Schlüsselpaar (das muss euch nicht viel sagen, nur, dass 4096 schon als nahezu unknackbar gilt). Dazu kommt natürlich noch, dass so ein Updatesystem wesentlich benutzerfreundlicher ist, das werdet ihr ja dann sehen. Also wollen wir starten :)


      Einrichtung


      Um nUpdate nutzen zu können, benötigt ihr einen FTP-Server. Zwar nicht zwingend, denn eigene Handler für die Uploads etc. sind möglich, aber die integrierte Unterstützung setzt auf FTP(S). Wenn ihr noch keinen habt, könnt ihr euch auf vielen verschiedenen Seiten kostenlos einen zulegen. Dazu einfach mal in Google mit dem Suchbegriff kostenloser webspace suchen - da findet ihr garantiert einen!

      Zuerst solltet ihr euch nUpdate herunterladen. Dies geht über diesen Link:
      nupdate.net/ unter Downloads oder im Thread: nUpdate - Die einfache Updatelösung

      Anschließend entpackt ihr das Archiv und erhaltet 3 Ordner:
      - nUpdate
      - nUpdate.Administration
      - nUpdate.Administration.TransferInterface
      - nUpdate.Client.GuiInterface

      Wir wollen nUpdate erstmal auf unserm FTP-Server einrichten. Dazu navigieren wir in den Ordner nUpdate.Administration und starten die darin enthaltende Anwendung nUpdate Administration.exe (ggf. als Administrator, wenn ihr wollt, dass nUpdate sich in die Registry schreibt, damit die Dateiendungen direkt mit dem Programm gekoppelt werden).


      Fangen wir an, indem wir auf die Schaltfläche mit der Aufschrift New project klicken. Nun werden die Schlüssel generiert, das kann kurz dauern. Anschließend geben wir den Namen unseres Programms und die Http-Update-Url an. Euer Webspace muss eine Url haben, wodurch dieser über das Http-Protokoll erreichbar ist. Diese wählt ihr meistens bei der Erstellung des Accounts aus. Anschließend geben wir noch den Ort von nUpdate an. Ihr solltet nUpdate in einem Unterverzeichnis erstellen, in meinem Fall ist es /nUpdate:


      Der Ordner muss noch nicht existieren. Desweiteren könnt ihr noch den Speicherort auswählen und angeben, ob eure Account-Daten gespeichert werden sollen. Wir bestätigen mit einem Klick auf Continue. Nun geben wir unsere FTP-Daten an. Das sollte alles bei eurem Webspace-Anbieter unter FTP-Informationen stehen.

      Wenn alles eingeben ist, wählen wir Search on Server. Nun öffnet sich ein FTP-Client, mit welchem wir direkt versuchen auf unseren Server zu verbinden. Wenn dies geschehen ist, müssen wir den Ordner wählen, den wir bei Schritt 1 angegeben haben (bei mir http://hurricaneproject.bplaced.de/nUpdate). Wir müssen diesen ggf. erst erstellen.

      Wir bestätigen in dem FTP-Client mit einem Klick auf Continue und gehen auf die nächste Seite mit einem weiteren Klick auf Continue (Der ausgewählte Ordner sollte nun in der TextBox hinter Directory stehen).

      Wenn ihr Statistiken braucht, könnt ihr euch nun einen Statistik-Server erstellen.
      Dazu wählt Ihr Use a statistics server und klickt auf Select server....

      Bestätigt die kommende Meldung mit "OK". Ich vermute, dass Ihr dann noch keinen Server erstellt habt und die Liste leer ist. :D Falls nicht könnt Ihr den folgenden Schritt einfach auslassen.

      Dann klickt Ihr auf Add server.


      So, nun braucht Ihr externen Zugriff auf eure Datenbank. Dies lässt sich bei den meisten Hostern durch ein Support-Ticket aktivieren, falls dies nicht standardmäßig der Fall ist. Bei PHP-Friends wäre diese Info z.B. unter php-friends.de/blog/wiki/zugangsdaten/mysql/ unten bei Externer Zugriff zu finden. Sollte das bei eurem Hoster nicht gehen, dann habt Ihr momentan leider noch nicht die Möglichkeit Statistiken zu nutzen. Sobald euer Hoster das aktiviert hat und die MySQL-Datenbank zugreifbar ist, könnt Ihr den Dialog mit den Eingaben beglücken.
      Bei Host/Server gebt Ihr einfach die Adresse ein, die der Hoster für externen MySQL-Zugriff bereitstellt. In diesem Fall habe ich als Beispiel das Ticket von @Trade, in dem dann die Daten zugesendet wurden:



      So kann das dann aussehen.
      Also gebt Ihr bei Host/Server z. B. web1.php-friends.de an, je nachdem, bei welchem Hoster Ihr seid und was er an Daten angibt. Bei Database kommt der Name der Datenbank hin, in der die Statistikdaten gespeichert werden sollen. Wenn diese noch nicht existiert, wird diese erstellt.
      Bei Username kommt auch der hin, der vom Hoster angegeben wurde. Dies steht dann auch wie oben im Bild irgendwo.


      Das war's. Auf Save klicken!
      Dann könnt Ihr in der Liste einfach den Server auswählen und Enter drücken.


      Wir klicken zurück im Dialog weiter auf Continue. Für den Fall, dass ihr einen Proxy habt, könnt ihr diesen nun eintragen. Dort einfach URL des Proxy, Benutzername und Passwort. Falls Ihr keine Credentials angebt, werden die Default Credentials verwendet. Je nachdem, füllt Ihr das aus. Sollte selbsterklärend sein. ;) Wir klicken wieder auf Continue und das ganze wird abgeschlossen.

      Erster Start


      Wir öffnen unser Projekt über Open project. Wenn ihr eine Fehlermeldung seht, könnt ihr diese ignorieren. Uns werden allerlei Informationen angezeigt, die wir u. a. während des Erstellungsprozesses angegeben haben.


      nUpdate in ein Projekt integrieren


      Das ist ziemlich einfach. Als erstes öffnen wir unsere Projektmappe, gehen zu Projekt > Verweis hinzufügen...

      Anschließend gehen wir unten rechts auf Durchsuchen...

      und wählen die nUpdate.dll-Datei aus. Diese befindet sich in nUpdate\Providing TAP oder nUpdate\No TAP. Wenn Ihr .NET 4.5 benutzt, könnt Ihr die aus "Provide TAP" nutzen. Diese integriert die Schlüsselworter async und await und bietet Tasks an. Dies sind neue Features der aynchronen Programmierung seit .NET 4.5. Ansonsten ( < .NET 4.5 ) nehmt Ihr die DLL aus "No TAP" und habt halt nur die normalen Methoden und alles arbeitet mit Events. Wir klicken auf Hinzufügen und auf OK.

      Nun navigieren wir in unserem geöffneten nUpdate-Projekt zu Copy data (ganz unten) und wählen anschließend unsere bevorzugte Sprache aus. Ist das getan, wird durch einen Klick auf Copy Source ein Codeschnipsel in unsere Zwischenablage kopiert:


      Geht dann in eure void/Sub bzw. Prozedur, in der Ihr die Updatesuche usw. laufen lassen wollt (z. B. Click-Event eines Button). Dort fügt Ihr den Code ein. Falls Fehler kommen, braucht Ihr noch das ganz oben:

      C#-Quellcode

      1. using System.Globalization;
      2. using nUpdate.Updating;


      VB.NET-Quellcode

      1. Imports System.Globalization
      2. Imports nUpdate.Updating


      Unter den eingefügten Code schreibt Ihr dann noch:

      C#-Quellcode

      1. var updaterUI = new UpdaterUI(manager, SynchronizationContext.Current);
      2. updaterUI.ShowUserInterface();


      VB.NET-Quellcode

      1. Dim updaterUI As New UpdaterUi(manager, SynchronizationContext.Current)
      2. updaterUI.ShowUserInterface()


      Das wird dann alles automatisieren und das integrierte UI anzeigen. Falls Ihr möchtet, dass im Hintergrund gesucht wird und nur ein Dialog kommt, wenn ein Update gefunden wird und Ihr keinen Such- und "Keine Updates gefunden"-dialog wollt, dann macht Ihr noch

      C#-Quellcode

      1. updaterUI.UseHiddenSearch = true;


      VB.NET-Quellcode

      1. updaterUI.UseHiddenSearch = True


      Als letztes brauchen wir noch ein Attribut für die aktuelle Version, welche eine große Rolle spielt.
      Dazu geht Ihr in die AssemblyInfo.cs und fügt das ein:

      C#-Quellcode

      1. [assembly: nUpdateVersion("0.1")]


      In VB.NET müsst ihr in dem Projektmappen-Explorer auf Alle Dateien anzeigen gehen und anschließend My Project aufklappen:

      Dort findet ihr ebenfalls eine Datei mit dem Namen AssemblyInfo.vb, in welcher ihr folgendes eintragt:

      VB.NET-Quellcode

      1. <Assembly: nUpdateVersion("0.1")>


      Falls ein Fehler kommt, ganz oben Import setzen:

      C#-Quellcode

      1. using nUpdate.Core;


      VB.NET-Quellcode

      1. Imports nUpdate.Core


      Das 0.1 ist ein Beispiel. Sollte eure aktuelle Version 1.0 sein, so gibt Ihr das da an. Wie Ihr das alles angeben könnt, da gibt es viele Möglichkeiten. @Trade hat diese im nUpdate-Thread aufgelistet bei den Details zur UpdateVersion.
      Diese Version müsst Ihr bei jedem Update ändern. Solltet Ihr also grade die 1.2 fertigprogrammiert haben, so setzt Ihr bevor Ihr die Dateien in ein Paket einbindet (mehr dazu, wie das geht, kommt dann natürlich noch unten) diese Attribut von bspw. 1.0 innen auf 1.2. Somit weiß nUpdate, dass dann die aktuelle Version 1.2 ist und sucht nach Versionen darüber. Bei Fragen fragen.

      Sprache

      Bei dem Teil new CultureInfo("en") könnt Ihr nun die Sprache angeben. Mitgeliefert ist en, de-DE, de-AT und de-CH. Im nächsten Update wird wohl Englisch noch ausgeweitet und es kommen evtl. mehr Sprachen.

      Ihr könnt eigene Sprachen hinzufügen, wenn Ihr wollt. Dazu müsst Ihr euch zunächst das Language Template laden: nupdate.net/langtemplate.json
      Dann müsst Ihr dort eben das Ganze bearbeiten und die JSON in euer Projekt mitliefern und zum Client bringen (einfach in AppData) schreiben o. ä. Wenn Ihr das alles habt, kommt die Eigenschaft manager.CultureFilePaths ins Spiel.
      Wenn Ihr bspw. italienisch hinzugefügt habt, dann ruft Ihr manager.CultureFilePaths.Add(new CultureInfo("it"), "PfadZurJson"); auf.
      Der erste Parameter ist also die Kultur (it für Italien) und der zweite der Pfad zur Sprachdatei. Dann könnt Ihr nun auch Italienisch nutzen.

      Solltet Ihr eine Sprache nutzen, die es nicht gibt und die nicht hinzugefügt wurde, dann wird automatisch Englisch genutzt.
      Das könnt Ihr aber trotzdem machen, da sich nach dieser Sprache auch der Changelog richtet. Solltet Ihr also einen italienischen Changelog haben, aber keine italienische Sprachdatei und Ihr stellt trotzdem Italienisch ein, so ist das User Interface englisch, aber der Changelog italienisch.
      Mehr dazu findet Ihr aber in Pakete verwalten unten dann in der Sektion Changelog.

      Weitere Einstellungen

      Alle Eigenschaften + Methoden und Events findet Ihr unter nupdate.net/docs
      Ich liste hier kurz das wichtigste auf:
      • IncludeAlpha - Alpha-Versionen in die Suche einbeziehen
      • IncludeBeta - Beta-Versionen in die Suche einbeziehe
      • CloseHostApplication - Gibt an, ob euer Programm vor dem installieren geschlossen werden soll. Solltet Ihr also keine Daten überschreiben, die euer Programm gerade nutzt, so könnt Ihr das auf False setzen. Standard ist True.
      • Proxy - Ein Proxy, den Ihr hier angeben könnt
      • Arguments - Die Updateargumente, die Ihr an eure Anwendung nach dem Installieren übergeben wollt. Mehr dazu darunter.

      Updateargumente

      Diese Argumente könnt Ihr festlegen und diese werden an eure Anwendung übergeben, je nachdem, ob das Installieren erfolgreich war oder fehlgeschlagen ist.

      C#-Quellcode

      1. var succeededArgument = new UpdateArgument("success", UpdateArgumentExecutionOptions.OnlyOnSucceeded);
      2. var failedArgument = new UpdateArgument("fail", UpdateArgumentExecutionOptions.OnlyOnFaulted);
      3. manager.Arguments.Add(succededArgument);
      4. manager.Arguments.Add(failedArgument);


      VB.NET-Quellcode

      1. Dim succeededArgument As New UpdateArgument("success", UpdateArgumentExecutionOptions.OnlyOnSucceeded)
      2. Dim failedArgument As New UpdateArgument("failed", UpdateArgumentExecutionOptions.OnlyOnFaulted)
      3. manager.Arguments.Add(succededArgument)
      4. manager.Arguments.Add(failedArgument)


      Wenn das Installieren klappt, wird an eure Anwendung als Argument success übergeben, andernfalls fail. Abrufen könnt Ihr diese Angaben dann im Einstiegspunkt in euerer Anwendung (Main). Solltet Ihr nicht wissen, wie das geht, schaut mal bei Google oder fragt nach.

      Pakete verwalten


      Nun gehen wir in unser Projekt und können die Pakete verwalten. Fügt ein neues Paket hinzu, indem Ihr Add package klickt.


      Ein neuer Dialog öffnet sich. Ich werde jetzt auf jede Sektion eingehen und was Ihr dort einstellen könnt:

      Spoiler anzeigen

      General



      Hier könnt Ihr Version und Entwicklungsstadium angeben.
      Die Version 0.0.0.0 ist nicht gültig. Sie muss also mindestens 0.1 sein. Als Entwicklungsstadium könnt Ihr dann Alpha, Beta, RelaseCandidate und Release wählen. Nach Alpha-Versionen wird nur gesucht, wenn im Client manager.IncludeAlpha auf True gesetzt wird und entsprechend auch bei Beta-Versionen mit manager.IncludeBeta. ReleaseCandidate und Release-Versionen werden natürlich immer angezeigt.
      Den Development Build könnt Ihr dann in dem NumericUpDown daneben angeben. 0 bedeutet, dass dieser nicht beachtet wird und die Version zum Beispiel dann nur 1.2.3.0 Beta ist.

      Die Hierarchie sollte klar sein:
      1. Release
      2. ReleaseCandidate
      3. Beta
      4. Alpha
      Wenn euer Updatepaket also die Version 1.2.3 Alpha 1 hat, wird diese nicht mehr angezeigt, wenn ein Paket mit 1.2.3 Beta 1 verfügbar ist, da diese Version höher ist. Ich denke, das versteht sich von selbst.
      1.2.3 Alpha 1 würde ebenso nicht mehr angezeigt, wenn 1.2.3 Alpha 2 existiert usw.
      Also immer in dieser Hierarchie und Release steht natürlich ganz oben.

      Dann könnt Ihr bei Publish this update angeben, ob das Paket schon hochgeladen und für jeden herunterladbar sein soll oder nicht (standardmäßig ist dies aktiviert). Wenn nicht aktiviert, wird das Paket zunächst lokal gespeichert und kann später dann hochgeladen werden. Wenn es noch nicht online ist, dann bekommt es der Client natürlich auch noch nicht angezeigt.

      Daraufhin könnt Ihr festlegen, auf welchen Architekturen das Update installiert werden soll, was ja durchaus mal sein kann, dass man da unterscheiden muss.
      x86 ist für 32 Bit-Systeme, x64 für 64 Bit-Systeme und AnyCPU ist für beides, also unabhängig und damit der Standard.

      Die nächste Einstellung ist Necessary Update und sehr nützlich. Wenn Ihr beispielsweise eine große Menge Daten habt und diese nur 1 mal und nicht jedes Mal hochladen wollt, dann braucht Ihr das.
      Stellt euch vor, Ihr habt ein Spiel und 1GB an neuen Karten oder was weiß ich, ohne die Einstellung müsstest Ihr die jedes Mal mitliefern, um sicherzugehen, dass diese auch wirklich installiert werden. Wenn diese nämlich zum Beispiel in 1.2.3 dazukommen und danach schon 1 Tag später ein Update 1.2.4 kommt, dann wird das 1.2.4 als neuestes Update angezeigt und es könnte sein, dass so mancher User das 1.2.3 noch nicht geladen hat, wo diese Daten drin sind. Ihr müsstet also zur Sicherheit die Mapdaten in 1.2.4 auch wieder mitliefern, obwohl Ihr nur einen kleinen Bug gefixed habt. Das ist natürlich blöd, nervig und kostet Zeit.
      Dies wird das Problem lösen, denn wenn Ihr dieses Paket als "necessary", also notwendig markiert, dann muss der Client es installieren, egal ob es neuere Versionen gibt oder nicht. Somit würden also als neue Updates dann 1.2.3 und 1.2.4 angezeigt werden und beide auf einen Ruck installiert.



      Wichtig dabei ist auch, dass der nUpdate Installer die Reihenfolge der Versionen beim Installieren einhält, um Konflikte auszuschließen.

      Am Ende könnt Ihr noch Include into statistics aktivieren oder deaktivieren. Falls Ihr also einen Statistikserver eingerichtet habt und Informationen über die Downloads dieses Pakets/Updates wollt, dann könnt Ihr das checken. Die Option ist ausgegraut (disabled), wenn Ihr keinen Server eingerichtet habt.

      Changelog

      Der Changelog, also die Änderungen sind auch ein wichtiger Bestandteil eures Pakets und müssen zumindest in der Sprache "Englisch" angegeben werden. Oben links könnt ihr eine Kultur für die Sprache auswählen (z. B. de-DE für Deutschland, en-US für die USA usw.) und dann jeweils im Textfeld unten den Changelog in dieser Sprache angeben.




      Das Ganze läuft über Kulturen, da Ihr somit mehr Möglichkeiten habt und Inhalte individuell angeben könnt.
      Sollte euer nUpdate-Projekt zum Beispiel als Sprache auch Finnisch unterstützten, aber Ihr vergesst, einen Changelog auf Finnisch anzugeben, dann bekommen diese den englischen angezeigt, da das am Gängigsten ist. Der Changelog richtet sich also nach der ausgewählten Kultur im nUpdate-Projekt bei new UpdateManager(..., new CultureInfo("de-DE"));. In diesem Fall müsstet Ihr einen Changelog für Deutschland (de-DE) angeben, damit dieser entsprechend angezeigt wird. Wenn dann zum Beispiel new CultureInfo("es") dort steht, dann würde ein Changelog für spanische Clients dort angezeigt werden, wenn Ihr einen bereitstellt. Wenn nicht, dann eben englisch.

      Ihr könnt natürlich den Changelog auch aus einer Datei laden.
      Spezielle Zeichen findet Ihr rechts oben auch noch, damit Ihr diese nicht mühsam zusammensuchen müsst und schnell parat habt.

      Availability

      Auch eine sehr coole Sache, denn hier könnt Ihr einstellen, welche Versionen Ihr nicht mehr unterstützen wollt. Falls also Version 1.0 auf XP läuft und Version 2.0 für Windows Vista dann gemacht wurde (als Beispiel mal), dann könnt Ihr unten "1.0.0.0" eingeben und hinzufügen. Dieses Update wird dann für die Clients mit Version 1.0 nicht angezeigt und diese bleiben, wo sie sind. Hingegen die Vista-User mit Version 2.0 werden das Update bekommen. Sei jetzt mal dahingestellt, ob das so genau Sinn macht, weil jeder das ja anders handhabt, aber um das Prinzip zu verstehen. ;)



      Operations

      Ein wirklich sehr wichtiger Bestandteil eines Updates sind die Operationen. Dort könnt Ihr wirklich alles angeben und beim Installieren des Updates wird das dann gemacht. Falls Ihr also eine Datei löschen wollt, einen Registryeintrag machen müsst oder einen Service starten, das könnt Ihr hier machen.
      Sogar eigene C#-Scripts können ausgeführt werden, falls Ihr noch was braucht.

      Eine Operation namens Replace file/folders ist standardmäßig schon da und lässt sich auch nicht löschen. In dieser könnt Ihr die Binaries, also aktualisierten Dateien etc. angeben, die die alten überschreiben sollen.
      Es gibt dort 4 Ordner, Program für den Pfad, in dem eure .exe (Anwendung) liegt, AppData für das AppData-Verzeichnis, Temp für den Temp-Ordner und Desktop für den Desktoppfad.

      Ihr könnt oben nun einen Ordner samt seiner Unterordner und Dateien hinzufügen, nur den Inhalt eines Ordners oder einzelne Dateien. Durch einen Klick auf "Information" (bald wird dies über den Knopf mit dem Fragezeichen in der Menüleiste oben rechts verfügbar sein) wird euch gezeigt, wie das Ganze abläuft.



      Sollte euer Programmordner also folgendes enthalten...
      • YourProgram.exe
      • Settings.txt

      ... dann könnt Ihr diese mit den neuen überschreiben, indem Ihr unter "Program" auf "Add files" klickt und dann diese Dateien (YourProgram.exe und Settings.txt), die Ihr vorhin auf den aktuellsten Stand gebracht habt, auswählt. Dann werden diese die alten ersetzen.

      Falls ein Ordner im Programmverzeichnis vorhanden ist, müsst Ihr auch einen Ordner hinzufügen. Zum Beispiel wieder:
      • YourProgram.exe
      • Settings.txt
      • TestOrdner
        • DateiImOrdner.txt

      So könnt Ihr dann ebenfalls wieder die Dateien hinzufügen und nun auch den ganzen Ordner samt Inhalt (TestOrdner) mit "Add folder". Ordner werden nie ganze Ordner ersetzen, sondern nur die Dateien darin. Solltet Ihr also einen leeren Ordner hinzufügen, so wird der alte Ordner beim Client nicht mit einem leeren ersetzt, sondern alles bleibt wie es ist. Das Ganze geht dann rekursiv, also wiederholt sich immer wieder für alle hinzugefügten Unterordner.
      Neue Dateien könnt Ihr natürlich auch hinzufügen. Diese ersetzen nichts, sondern kommen einfach hinzu. ;)
      Und so geht das natürlich nicht nur für das Programmverzeichnis, sondern auch für AppData, Temp und Desktop.

      Um Dateien zu löschen, braucht Ihr die Operation Delete file.
      Zu den Operationen jetzt mehr:

      Klickt auf Operations und es erscheint nun rechts eine Liste.



      Dort könnt Ihr ein Item auswählen und auf den Knoten Operations, wo Ihr grade draufgeklickt habt, ziehen. Also per Drag&Drop.

      Dann, wenn nicht automatisch gesehen, auswählen und ausfüllen.



      Das ganze sollte selbsterklärend sein und es wäre ein wenig viel, auf jede Operation einzugehen. Solltet Ihr spezielle Fragen zu einer haben, könnt Ihr aber gerne unten fragen.
      Eine Sache, da das oft falsch gemacht wird: Bei "Terminate process" nur den Namen des Prozesses angeben, kein .exe o. ä.!
      Ansonsten helfen euch auch die Cues, also die grauen Texte, die bereits in den TextBoxen stehen bei den Eingaben.

      Soweit so gut, dann könnt Ihr nun auf Create package klicken und warten, bis sich der Dialog schließt. :) Sollte es ein Problem geben und das Hochladen nicht gehen, so wird das Paket lokal gespeichert und Ihr könnt es später erneut versuchen. Dies passiert auch, wenn ihr das Hochladen über das graue "X" abbrecht. Dazu noch ein Hinweis, denn es gibt einen Bug in der Beta 4, der den Dialog beim Abbrechen nicht automatisch schließt. Dann einfach kurz warten und den Dialog selber zumachen. Dies wurde aber von @Trade in der aktuellen Versionen, die er grade entwickelt, schon behoben.


      Schlusswort


      Das waren natürlich noch lange nicht alle Features von nUpdate. Es wird bald ein weiterer Teil kommen, der eigene UIs behandelt.
      Mfg
      Vincent

      Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „VincentTB“ ()

      Meinst Du den zu eigenen UIs? Da gibt es noch keinen momentan. Wenn ja, im Programm oder Installer?

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

      VincentTB schrieb:

      manager.Arguments.Add(succededArgument)
      Da ist ein kleiner Fehler, sollte heißen:

      VB.NET-Quellcode

      1. ​manager.Arguments.Add(succededArgument)

      Ist natürlich überhaupt nicht schlimm, nur damit ihr das ausbessern könnt. Danke für das gute Tutorial.

      VincentTB schrieb:

      Wenn das Installieren klappt, wird an eure Anwendung als Argument success übergeben, andernfalls fail. Abrufen könnt Ihr diese Angaben dann im Einstiegspunkt in euerer Anwendung (Main). Solltet Ihr nicht wissen, wie das geht, schaut mal bei Google oder fragt nach.
      Diesen Teil kapiere ich nicht ganz. Wie kann ich mit If dann letzendlich abfragen, ob es geklappt hat oder nicht?
      Du schreibst dass bei deinem Start-Code

      VB.NET-Quellcode

      1. If Environment.GetCommandLineArgs().Lenght = 2 Then
      2. If Environment.GetCommandLineArgs()(1) = "success" Then
      3. Msgbox("Update erfolgreich")
      4. ElseIf Environment.GetCommandLineArgs()(1) = "fail" Then
      5. MsgBox("Update fehlgeschlagen")
      6. End If
      7. End If
      Bei den Maßen der Einfachheit stößt man an Grenzen, aber: "Es geht immer komplizierter".

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Popa21“ ()

      Eher nicht. Das heißt, dass mit dem Webserver irgendwas nicht stimmt. Kann sein, dass es nur eine kurze Downtime ist, aber evtl. ist mit der URL etwas falsch.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

      Trade schrieb:

      Eher nicht. Das heißt, dass mit dem Webserver irgendwas nicht stimmt. Kann sein, dass es nur eine kurze Downtime ist, aber evtl. ist mit der URL etwas falsch.
      Habe es mal erneut probiert, jetzt kommt diese Meldung.
      Mit der in nUpdate eingetragenen Adresse komme ich in meinem normalen Browser auf das Verzeichnis von meinem FTP-Server.
      Dennoch tritt ein Fehler auf. Was muss ich bei der Eingabe der URL beachten?
      Also update.highter.de/ gibt mir auch im Browser zurück, dass der Server nicht gefunden wurde.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Ohne www. davor. Das macht natürlich einen Unterschied, den Du angeben musst.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Das ist sehr komisch. Speicherst Du das Projekt auch korrekt ab?

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Damit meinte ich eher, ob Du das dann wieder korrekt über den Dialog alles speicherst. ;) Also mit "Continue" bis zum Ende durchläufst.
      Was steht denn in der Projektdatei (JSON), nachdem Du sie speicherst?

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

      Trade schrieb:

      Also mit "Continue" bis zum Ende durchläufst.

      Achso ja.

      Nochmal zusammenfassend.
      Wenn ich das nUpdate Projekt editiere und dann
      1. das auswähle:
      dann kommt das gegen Ende des Dialogs des Einstellens:
      2. das auswähle:
      dann kommt dass, wenn ich in die Administration von nUpdate gehe (also vom Hauptmenu auf Open project und dann mein Projekt auswähle):
      Jo, ich sehe das Problem. Schick mir mal Deine Projektdatei per PN, dann repariere ich Dir das.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      nUpdate legt die Updatepakete innerhalb "nUpdate/Projektname" im Temp-Ordner ab.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Problem mit nUpdate 3.4.1

      Guten Morgen
      Ich habe in meinem Programm eine älter nUpdate Version eingebunden. Ich glaube Version 3.3.
      Damit habe ich auch ein paar Updates durchgeführt. Das hat bisher immer funktioniert, mit der Ausnahme, dass ich von zuhause aus keine Updatepakete hochladen kann, im Laden geht aber alles mit den gleichen Settings wunderbar.
      Daher schiebe ich das irgendwie auf den Hoster (bplaced), oder meine Routereinstellungen zuhause.

      Nun habe ich gestern Abend die nUpdate Version 3.4.1 heruntergeladen.
      Dazu habe ich den Verweis auf die (alte) nUpdateProvideTAP entfernt und für die neue Version einen Verweis gesetzt.
      Außerdem habe ich die Administration der 3.4.1 ausgeführt.
      Sonst habe ich nichts weiter verändert.

      Beim ersten laden des Updateprojektes in der nUpdate Administration kam eine Meldung, dass die alten Pakete migriert werden, dass hat wunderbar funktioniert, auch der Upload der neuen Version lief reibungslos.
      Wenn ich aber nun mein Programm updaten möchte, wird die neue Version gefunden und beim kopieren der exe (mehr wird nicht ersetzt) erscheint angehängter Fehler, der dann auch zum abbruch führt.
      Habe ich beim nUpdate Versionswechsel etwas falsch gemacht?
      Die updates.json vom Server habe ich auch mal angehängt, falls du diese brauchst (gezipt, weils Forum die Endung nicht mag)
      Bilder
      • Anmerkung 2019-06-27 084408.jpg

        151,81 kB, 820×630, 217 mal angesehen
      Dateien
      • updates.zip

        (5,55 kB, 194 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DerSmurf“ ()