2009-03-24 7 views
13

Wir verwenden Wix, um Setups für unsere Anwendung zu erstellen. Für den Fall, dass der Benutzer bereits eine ältere Version unserer Anwendung installiert hat, führen wir ein großes Upgrade mit der MajorUpgrade XML element durch. Dies funktioniert alles wie gewünscht: Wenn eine ältere Version installiert ist, wird sie transparent aktualisiert. Wenn eine neuere Version vorhanden ist, bricht das Installationsprogramm mit einer eindeutigen Nachricht ab.Wie behebe ich die Upgrade-Logik eines Wix-Setup nach dem Ändern von InstallScope zu "perMachine"

Allerdings möchte ich jetzt die InstallScope von "perUser" in "perMachine" ändern. Leider bricht dies die Upgrade-Logik. Das neue Installationsprogramm scheint die vorherige "perUser" -Installation nicht zu erkennen und zu entfernen. Stattdessen wird es nur auf der älteren Version im gleichen ProgramFiles-Speicherort installiert. Der Benutzer sieht zwei Einträge in der Liste "Programme hinzufügen/entfernen" und sieht zwei identische Verknüpfungen auf dem Desktop (die alte benutzerspezifische und die neue perMachine).

Wie übertrage ich mein Installationsprogramm von "perUser" auf "perMachine", ohne die Upgrade-Logik zu unterbrechen?

Antwort

5

Beginnend mit Konfiguration per-Maschine aus.

<Property Id="ALLUSERS" Value="1" /> 

Dies wird eine automatische pro-Maschine-Prüfung durchführt (wenn Sie das MajorUpgrade Element arbeiten haben, nehme ich an), die den vorherigen pro Benutzer installiert nicht abholen:

Action start 15:46:35: FindRelatedProducts. 
MSI (c) (D0:0C) [15:46:35:496]: FindRelatedProducts: current install is per-machine. Related install for product '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}' is per-user. Skipping... 
MSI (c) (D0:0C) [15:46:35:496]: FindRelatedProducts: current install is per-machine. Related install for product '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}' is per-user. Skipping... 

So vor installieren, stellen Sie sicher, dass Sie einen anderen FindRelatedProducts Anruf für Produkte ausführen, die in Benutzerbereich (zB wie diese) installiert wurden:

<!-- temporarily switch to per-user install scope--> 
<Publish Dialog="MyWelcomeDlg" Control="Next" Property="ALLUSERS" Value="{}">1</Publish> 
<!-- find related products that have been installed per-user --> 
<Publish Dialog="MyWelcomeDlg" Control="Next" Event="DoAction" Value="FindRelatedProducts">1</Publish> 
<!-- switch back to per-machine install scope--> 
<Publish Dialog="MyWelcomeDlg" Control="Next" Property="ALLUSERS" Value="1">1</Publish> 

Dies wiederum findet die pro Benutzer installieren:

Action start 15:46:36: FindRelatedProducts. 
FindRelatedProducts: Found application: {0C6604FB-58EC-48B9-8259-5871EFDADEB9} 
MSI (c) (D0:88) [15:46:36:716]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}'. 
MSI (c) (D0:88) [15:46:36:716]: PROPERTY CHANGE: Adding MIGRATE property. Its value is '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}'. 

Vorhandene Produkte werden entfernt, egal in welcher Überprüfung sie gefunden werden.

Action start 15:46:41: RemoveExistingProducts. 
RemoveExistingProducts: Application: {0C6604FB-58EC-48B9-8259-5871EFDADEB9} 

Auf einer seitlichen Anmerkung: Diese Umgehung keine grundsätzliche Schwierigkeit, die entsteht, wenn Sie Doppelzweck-Installateure haben: User1 an der Maschine könnte in pro-Benutzerbereich installieren, installiert dann später User2 pro-Maschine . Benutzer1 wird beide Installationen in seiner Programm-/Feature-Tabelle sehen, und ich weiß nicht, welcher Vorrang hat. Ziehen Sie in Betracht, nur mit Installationen pro Maschine zu gehen.

+0

Funktioniert auch anders herum =) –

+0

Wäre es möglich, diese Aktionen ohne UI auszuführen? (Ich habe kein Steuerelement, um die Publish-Elemente zu platzieren), was könnte eine gute Problemumgehung sein? –

7

Leider unterstützt das Windows Installer das nicht. Einige Prozesse außerhalb Ihres Pakets (ein Bootstrapper/Chainer?) Müssen das Upgrade von Benutzer zu Benutzer verwalten.

+0

dies für einen besonderen Fall war ich einmal hatte, aber keine Garantie - nützlich für die Seltsamkeit der Lösung jedoch: http://StackOverflow.com/a/12291807/129130. Ich frage mich, wie sich dies auf die MSI-Datenbank auswirkt - es scheint das Produkt pro Maschine neu zu registrieren und die Registrierung einer Benutzerinstallation aufzuheben, aber tut es dies für alle Benutzer? Ich erinnere mich nicht. Ich denke, wir haben dies als einmalige Lösung für Systeme mit hauptsächlich einem Benutzer verwendet. –

+0

Diese Antwort ist falsch. Sie * können * beide Installationsbereiche für vorhandene Produkte überprüfen. Siehe meine Antwort. –

1

können Sie diese Technik verwenden, pro-Benutzer installieren pro-Maschine-Installation zu erkennen: http://www.mail-archive.com/[email protected]/msg35197.html

+0

+1 interessanter Hack. Dieser Mailinglisten-Thread hat keine Bestätigung, dass er tatsächlich funktionieren würde. Ich bin nicht mehr mit diesem Problem beschäftigt, daher kann ich es nicht schnell testen. Wenn jemand bestätigen kann, dass es funktioniert, bitte Kommentar. –

+0

Das funktioniert nicht. Meiner Meinung nach wurde es nie getestet, da es nicht einmal kompiliert wird ... die ID "24INSTALLPERUSER" ist beispielsweise keine legale Kennung. Die Sequenzen 199 und 201 sind nicht richtig eiter. Ich korrigierte den Hack, um es funktionieren zu lassen, überprüfte mit orca, dass die beiden benutzerdefinierten Aktionen vor und nach FindRelatedProducts passen würden, aber zum Zeitpunkt der Ausführung des Setups werden beide benutzerdefinierten Aktionen weiterhin nach FindRelatedProducts ausgeführt. Sie erhalten eine Aktion "FindRelatedProducts überspringen: bereits auf der Clientseite ausgeführt". Schade, es wäre eine nette Idee gewesen ... –

+0

Ich habe etwas ähnliches getan und es funktioniert, siehe meine Antwort. –

0

Dies findet sowohl bestehende PerUser und/oder PerMachine installiert. Und erzwingt die neue Installation auf eine perMachine-Installation (offensichtlich logisch, um diese Bedingung wie gewünscht zu übernehmen). Dies funktioniert, wenn es als gewöhnliche Installation ausgeführt und still unter LocalSystem installiert wird (automatische Aktualisierungen). Beachten Sie, dass es nur eine Benutzerinstallation finden kann, wenn es als dieser Benutzer ausgeführt wird.

Erstellen Sie eine benutzerdefinierte Aktion (in DLL)

#pragma comment(linker, "/EXPORT:[email protected]") 
extern "C" __declspec(dllexport) UINT __stdcall RunFindRelatedProducts(MSIHANDLE a_hInstall) 
{ 
MsiSetProperty(a_hInstall, "ALLUSERS", "1"); 
MsiDoAction(a_hInstall, "FindRelatedProducts"); 
MsiSetProperty(a_hInstall, "ALLUSERS", ""); 
MsiDoAction(a_hInstall, "FindRelatedProducts"); 
MsiSetProperty(a_hInstall, "ALLUSERS", "1"); 
return ERROR_SUCCESS; 
}//end function 

Then "ersetzen", um die Standard-FindRelatedProducts mit der benutzerdefinierten Aktion

<InstallUISequence> 
    <FindRelatedProducts>0</FindRelatedProducts> 
    <Custom Action="RunFindRelatedProducts" Before='FindRelatedProducts'>NOT Installed</Custom> 
</InstallUISequence> 
<InstallExecuteSequence> 
    <FindRelatedProducts>0</FindRelatedProducts> 
    <Custom Action="RunFindRelatedProducts" Before='FindRelatedProducts'>NOT Installed</Custom> 
</InstallExecuteSequence> 
Verwandte Themen