2012-10-16 8 views
9

Mam instalację spalania, przy czym użytkownik może wybrać, która z trzech opcji instalacji - każdy z nich bezpośrednio odnosi się do jednej z trzech MsiPackages w łańcuchu, takich jak:WiX Spal - Określić, jakie elementy są już zainstalowane

<Chain> 
    <MsiPackage SourceFile="..\ProductA\bin\Release\ProductA.msi" InstallCondition="chkProductA" /> 
    <MsiPackage SourceFile="..\ProductB\bin\Release\ProductB.msi" InstallCondition="chkProductA" /> 
    <MsiPackage SourceFile="..\ProductC\bin\Release\ProductC.msi" InstallCondition="chkProductC" /> 
</Chain> 

Wszystko w porządku. Jednak, gdy następnym razem uruchomię msi, chcę tylko ponownie zainstalować/zaktualizować elementy, które zostały wybrane pierwotnie - tj. Jeśli wybrano tylko productA, nie chcę instalować produktów B C.

Jak określić, co zostało pierwotnie wybrane?

Odpowiedz

11

OK, Posortowałem, więc najlepiej opublikuję moje rozwiązanie.

Ostatecznie sprowadza się do dwóch części ...

a) ustawienie klucza rejestru w każdym z produktów firmy MSI, które są ustawione na instalacji. Oczywiście jeśli ten MSI nie był pierwotnie zainstalowany, wpis rejestru nie będzie istnieć. tj

<!-- registry entry to state that the item has been installed--> 
    <Component Id="cmp_WriteToRegistry" Guid="[yourguid]"> 
    <RegistryKey Root="HKLM" 
       Key="Software\MyCompany]" 
      Action="createAndRemoveOnUninstall"> 
     <RegistryValue Type="integer" Name="ProductA" Value="1" KeyPath="yes"/> 
    </RegistryKey> 
    </Component> 

b) Sprawdzenie istnienia tego klucza rejestru w oparzeniu robiąc upgrade ...

<!-- Determine what items are to be installed in the event of an install using the BA--> 
<WixVariable Id="chkProductA" Value="![CDATA[chkProductA]]" /> 
<WixVariable Id="chkProductB" Value="![CDATA[chkProductB]]" /> 
<WixVariable Id="chkProductC" Value="![CDATA[chkProductC]]" /> 

<!-- Determine what items are installed in the event of an upgrade--> 
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductAInstalled" Variable="ProductAInstalled" Result="exists" /> 
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductBInstalled" Variable="ProductBInstalled" Result="exists" /> 
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductCInstalled" Variable="ProductCInstalled" Result="exists" /> 

<Chain> 
    <MsiPackage SourceFile="..\SetupProductA\bin\Release\SetupProductA.msi" 
       InstallCondition="chkProductA OR ProductAInstalled" /> 
    <MsiPackage SourceFile="..\SetupProductB\bin\Release\SetupProductB.msi" 
       InstallCondition="(chkProductB) OR (ProductBInstalled)" /> 
    <MsiPackage SourceFile="..\SetupProductC\bin\Release\SetupProductC.msi" 
       InstallCondition="(chkProductC) OR (ProductCInstalled)" /> 
</Chain> 

</Bundle> 

Więc w InstallCondition, chkProductA wartość true, gdy używany jest interfejs i odpowiednie pole wyboru jest zaznaczone i ProductAInstalled jest wartością prawdy, gdy dany produkt został już zainstalowany - dbanie o aktualizację, która w moim przypadku dzieje się bez interakcji użytkownika.

Łatwo, kiedy wiesz jak. I na pewno nie zacząć ...

+0

Stara etykieta odpowiadania na twoje własne pytanie znowu ... Jeśli ktokolwiek ma lepszą odpowiedź, byłbym bardzo zadowolony, słysząc to, jakby powyższy był odpowiedzią, może nie być NAJLEPSZYM. Jeśli nie ma lepszych odpowiedzi w ciągu tygodnia, ustawię to jako odpowiedź. Nie łowię punktów, więc zgadnij, że to jest właściwa rzecz ... –

+0

Twoje rozwiązanie jest takie, jak bym to zrobił. Jest podobny do "Remember Property Pattern": http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern – BryanJ

+0

Dzięki, Bryan. Wciąż jestem na początkującym/na nowo wymyślam fazę koła, więc dobrze jest wiedzieć. –

4

Jeśli robisz własną aplikację udało inicjującego, można to zrobić w obsługi zdarzeń DetectPackageComplete:

CustomBA_DetectPackageComplete(object sender, DetectPackageCompleteEventArgs e) 
{ 
    if (e.PackageId == "SetupProductA" && e.State == PackageState.Present) 
    { 
     CustomBA.Engine.NumericVariables["chkProductA"] = 1; 
    } 
    etc... 
} 

Podobną rzecz można zrobić, aby wykryć zainstalowane funkcje przy użyciu DetectMsiFeature.

Powiedziałbym, że użyłbym tej metody tylko, jeśli masz już niestandardowe BA. Budowanie niestandardowego BA to lot z pracy.

+0

czy sugerujesz wykonanie wyszukiwania rejestru również w niestandardowej aplikacji boostraper? –

+0

@phoenix, nie trzeba przeprowadzać przeszukiwania rejestru, zakładając, że dołączasz zaktualizowaną wersję msi w pakiecie. Silnik wypalania wykryje istniejący msi w oparciu o powiązany kod aktualizacji msi w pakiecie i zwolni zdarzenie "DetectPackageComplete". John Wright napisał [dobry przykład] (http://www.wrightfully.com/part-4-of-writing-your-own-net-based-installer-with-wix-handling- current-and-future -state /) radzenia sobie z tym. –

Powiązane problemy