WiX: Upgrade Pitfalls

Art des Upgrades

tl;dr: MajorUpgrade ab der initialen Version!

Folgendes Szenario: Ich baue mit WiX einen MSI-Installer für meine Software. Die Software hat die Version 1.0. Nun möchte ich meine Software auf v1.1 upgraden. Was tun?

WiX bietet mehrere Möglichkeiten, namentlich “Major Upgrades”, “Minor Upgrades”, sowie “Small Updates”, die sich ungefähr so definieren:

  • Small Updates: Quasi ein Patch vorhandener Files, erfordert nicht (zwingend?) eine Änderung der Versionsnummer
  • Minor Upgrade: Aktualisiert bestehende Files ohne die vorhandene Software zu deinstallieren. Kann aber Features oder Komponenten hinzufügen. Erfordert neue (=höhere) Versionsnummer
  • Major Upgrade: “Deinstalliert das Produkt und installiert es neu”, erfordert neue (=höhere) Versionsummer und eine neue Product.Id (Achtung: Product.UpgradeCode “bleibt immer unverändert”)

Liest sich, als würde man meistens ein Minor Upgrade wollen. Internet sagt allerdings das Gegenteil, die Literatur* sieht Major Upgrades als “easier to implement than any other option” an, und last but not least empfiehlt WiX selbst:

When creating an .msi-based installer, you are strongly encouraged to include logic that supports Windows Installer major upgrades.

Was dabei nie so richtig, richtig klar wird (teilweise wird implizit das Gegenteil angedeutet): Beinhaltet nicht bereits Version 1.0 MajorUpgrade (sondern bspw. erst das erste Upgrade), dann funktioniert quasi nichts:

  • v1.1 wird nicht als Update erkannt, sondern parallel installiert!
  • Conditions funktionieren deshalb ebenfalls nicht wie erwartet, es gilt der Pfad wie bei Erstinstallation
  • Downgrades werden nicht verhindert, weil ja beides parallel installiert wird
  • In anderen Worten: Eine Installation, deren Installer nicht MajorUpgrade enthielt, wird von Upgrade/Downgrade-Logik komplett ignoriert!

Warum das dann nicht mandatorisch ist, wird wohl Microsofts Geheimnis bleiben.

*Nick Ramirez, “WiX 3.6: A Developer’s Guide to Windows Installer XML”, Seite 342

“Scheduling”

Per default deinstalliert ein MajorUpgrade die alte Version und installiert dann die neue. Das kann problematisch sein, denn ein Upgrade (engl. für “Verbesserung”, “Aufrüstung”!) sollte ja bspw. Konfigurationsdaten usw. behalten. Da hilft das Scheduling-Attribut:

sorgt dafür, dass bestehende Dateien (und in diesem Fall auch Services) erhalten bleiben. Es wird quasi definiert, wann das bestehende Produkt entfernt werden soll, und afterInstallExecute sagt “nach der Installation des Upgrades” – natürlich wird dann nur noch entfernt, was in v1.1 nicht mehr benötigt wird.

Achtung: Das setzt offenbar die Erkennung außer Kraft, die eine Neuinstallation derselben Version verhindert 🙄

Conditions

Bestimmte Schritte des Installers sollen nur bei Erstinstallation ausgeführt werden (etwa die Konfiguration durch den User, die Installation eines Services, …). Dafür gibt es Conditions, bzw. verschiedene States, auf die man prüfen kann – und das ist ziemlich unübersichtlich. Ich beschränke mich an dieser Stelle auf einen Stackoverflow-Post, der gute, sprechende Aliase definiert:

Adblock: Wildcards

class– oder auch id-Wildcards sehen so aus:

bzw.

Geblock wird jetzt alles, was “apester-” im jeweiligen Feld enthält. Wichtig dabei sind die Anführungszeichen, ohne ging es bei mir zumindest in uBlock nicht.

MS Edge: Sprache ändern

Die Sprache lässt sich in Edge wirklich ausgesprochen einfach ändern:

  1. Systemsteuerung → Internetoptionen → Allgemein → Darstellung → Sprachen → Spracheinstellungen festlegen → Bevorzugte Sprachen → Sprache hinzufügen → Sprache wählen, “Weiter” → “Sprachfeatures” werden “installiert”
  2. “Als meine Windows-Anzeigesprache festlegen” ggf. deaktivieren, “Installieren” (WTF, wurde das nicht im letzten Schritt grad installiert?)
  3. warten… ⏳
  4. Googlen, warum die Sprache nicht herunterlädt, Language Packs manuell herunterladen
    • UPDATE: Offenbar lädt er doch herunter, allerdings ist der Fortschrittsbalken extrem schlecht (selbst für Windows), und es dauert extrem lange, siehe auch 5.3
  5. Googlen, wie man manuell heruntergeladene Language Packs installiert:
    1. Startmenü, “Lpksetup” (case-sensitiv ausschreiben, sonst hat er es bei mir nicht gefunden, WTF)
    2. “Anzeigesprache installieren” → Datei auswählen → Weiter, Lizenz zustimmen (WTF, wer hält denn die Rechte an ITALIENISCH?)
    3. deutlich zweistellig Minuten warten… ⌛
    4. wiederholen für jede Sprachdatei 🤮
  6. Dialog aus 2. schließen, neu öffnen, Sprache sollte jetzt dort sein
  7. Googlen, warum man die neu installierte Sprache nicht ganz nach oben verschieben kann: Alle Sprachen entfernen und in der gewünschten Reihenfolge wieder hinzufügen (WTF, wozu gibt es die entsprechenden Buttons) oder mehr als zwei Sprachen installieren 🤦🏼‍♂️ Ja: Die Reihenfolge von genau zwei Sprachen ließ sich nicht ändern.
  8. Leider schickt der Edge weiterhin de-de als Accept-Language? (Und das möchte ich an dieser Stelle betonen: Es geht ausschließlich darum, einen HTTP-Request-Header zu ändern)

regedit hilft (hier am Beispiel en-US):

🚮

AWS Account kündigen vs. AWS Services kündigen

Wer einen AWS-Account kündigen möchte, der muss erst die darüber gebuchten Services kündigen 🙄

After taking a look at your account I see that the charges are coming from a Route53 Hosted Zone. Unlike most resources Route53 Hosted Zones remain on your account even after the account is closed. As a result you will see continual billing unless the Hosted Zone is terminated from the account.

Denn: Man kann die Hosted Zone nicht (mehr) “from the account” kündigen, wenn der Account bereits “gelöscht”(=gesperrt) ist.