2012-05-09 2 views
2

Я пишу установки WIX 2 требования:Wix - как переопределить UpgradeCode при установке MSI файла

  1. реализовать правила обновления (которые я успешно сделал с <MajorUpgrade> или <Upgrade> столом
  2. держать путь для принудительной установки старой версии параллельно текущей (так что не обновляйте).

Проблема возникает из-за второго требования: если все версии приложения имеют одинаковый код UpgradeCode, система удалит старую о ne (с тем же UpgradeCode) avec установите новый.

. Можно ли обновить старую версию (по умолчанию), а также позволить пользователю принудительно выполнить параллельную установку? Одним из решений, которое я имею, является изменение UpgradeCode при установке MSI. В этом случае 2 версии будут полностью независимыми, вот что я хотел бы.

Но я не нашел способ указать другой код UpgradeCode на стадии установки. Я попробовал msiexec /i app.msi UpgradeCode="{60C200E9-E317-4a67-9CC1-7BF156DEF4FD}", но в соответствии с журналами он правильно использует свойство UpgradeCode, но при использовании MSI все еще использует GUID.

Любая идея, как заставить обновить код при установке MSI?

Для получения информации, мой файл Wix состоит так:

<?define ProductUpgradeCode = "32318521-631C-4064-88C6-4A54FAA3B383"?> 
[...] 
<Product Name='App' Id='*' UpgradeCode='$(var.ProductUpgradeCode)' 
Language='1033' Codepage='1252' Version='1.0.0' Manufacturer='App inc'> 
[...] 
<MajorUpgrade AllowDowngrades="yes" Schedule="afterInstallInitialize" /> 

Edit - Решение, основанный на ответ Киприан в:

Во-первых, определить ALLOWUPGRADE свойство со значением по умолчанию для Yes:

<Property Id="ALLOWUPGRADE" Value="Yes" /> 

Затем, условие действие в <InstallExecuteSequence>, поэтому оно только удалить старые версии, если ALLOWUPGRADE=Yes:

<RemoveExistingProducts After="InstallFinalize">ALLOWUPGRADE="Yes"</RemoveExistingProducts> 

И, даже лучше, добавить диалог с запросом пользователя, если он хочет, чтобы обновить или сделать параллельную установку. Кнопка ParallelInstallBtn изменит стоимость объекта на No. Это диалоговое окно будет называться после FindRelatedProducts, если старая версия детектируется UpgradeVersion раздел:

<UI> 
    <Dialog Id="InstallDlg" Width="370" Height="270" Title="[ProductName] Setup" NoMinimize="yes"> 
    [...] 
    <Control Id="ParallelInstallBtn" Type="PushButton" X="280" Y="243" Width="80" Height="17" Default="no" Text="&amp;Parallel Install"> 
     <Publish Property="ALLOWUPGRADE" Value="No">1</Publish> 
     <Publish Event="EndDialog" Value="Return">1</Publish> 
    </Control> 
    </Dialog> 
    <InstallUISequence> 
    <Show Dialog="InstallDlg" After="FindRelatedProducts">OLDERVERSIONBEINGUPGRADED</Show> 
    </InstallUISequence> 
</UI> 
+1

Вы должны отправить решение в качестве ответа и принять его (рекомендуется!), А не редактировать его в свой вопрос. – Izzy

ответ

3

Вы можете сделать это зачистка RemoveExistingProducts действие.

<InstallExecuteSequence> 
     <RemoveExistingProducts After="InstallFinalize">ALLOWUPGRADE="Yes"</RemoveExistingProducts> 
</InstallExecuteSequence> 

По умолчанию значение свойства ALLOWUPGRADE будет «Да». Если вы не хотите, чтобы обновление было выполнено, измените его.

+0

Хорошо работает, спасибо! Я обновил сообщение и добавил диалоговое окно пользователя, которое запрашивает обновление или нет. – JulienR

+0

Ищете ответ на этот вопрос. Благодарю. – Hamp