2011-12-19 1 views
3

У меня странная проблема с установщиком WIX. Он имеет настраиваемое действие, предотвращающее приложение для установки, когда новая версии подарка:Предупреждение о предотвращении перехода WIX вниз отображается в неподходящее время

<Upgrade Id='SOME_GUID'> 
    <UpgradeVersion OnlyDetect='yes' Property='SELFFOUND' 
    Minimum='$(var.Version)' IncludeMinimum='yes' 
    Maximum='$(var.Version)' IncludeMaximum='yes' /> 
    <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND' 
    Minimum='$(var.Version)' IncludeMinimum='no' /> 
</Upgrade> 

<InstallExecuteSequence> 
    <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom> 
    <Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom> 
<InstallExecuteSequence> 

<CustomAction Id='AlreadyUpdated' Error='$(var.ProductName) has already been updated to $(var.Version) or newer.' /> 
<CustomAction Id='NoDowngrade' Error='A later version of $(var.ProductName) is already installed.' /> 

Ничего особенного - все как в учебнике WIX. Я использую интерфейс Mondo с небольшим количеством собственных пользовательских диалогов.

<UIRef Id="WixUI_Mondo" /> 

Проблема заключается в том, что пользовательское действие «NoDowngrade» выполняет после того, как нажать кнопку «Установить» кнопку, после того, как все шаги конфигурации прошли. Я ожидал увидеть сообщение сразу после запуска установщика. Я проверил installExecuteSEquence в таблице установщика, используя Orca util - «AlreadyUpdated» CA имеет Sequence = 27. В событии FindRelatedProducts есть Sequence = 25. 27 используется другим моим действием «NoDowngrade», почти таким же, как «AlreadyUpdated». Первый диалог пользовательского интерфейса должен быть смещен в последовательности = 49. Предположим, что PrepareDlg имеет это значение в InstallUISequence. Похоже, что ничего не может произойти между FindRelatedProducts и PrepareDlg, кроме моих пользовательских действий.

Но удивительно, что журнал установки говорит обратное:

MSI (c) (90:88) [13:08:03:768]: Running UISequence 
MSI (c) (90:88) [13:08:03:768]: PROPERTY CHANGE: Adding EXECUTEACTION property. Its value is 'INSTALL'. 
MSI (c) (90:88) [13:08:03:768]: **Doing action: FindRelatedProducts** 
Action 13:08:03: FindRelatedProducts. Searching for related applications 
Action start 13:08:03: FindRelatedProducts. 
FindRelatedProducts: Found application: {E25981A8-83D3-4183-B53C-F6E70FC9D1E0} 
MSI (c) (90:88) [13:08:03:769]: PROPERTY CHANGE: Adding SELFFOUND property. Its value is '{E25981A8-83D3-4183-B53C-F6E70FC9D1E0}'. 
Action ended 13:08:03: FindRelatedProducts. Return value 1. 
MSI (c) (90:88) [13:08:03:770]: Doing action: PrepareDlg 
-------------------- 
MSI (s) (2C:84) [13:08:10:658]: Running ExecuteSequence 
MSI (s) (2C:84) [13:08:10:658]: **Doing action: FindRelatedProducts** 
Action 13:08:10: FindRelatedProducts. Searching for related applications 
Action start 13:08:10: FindRelatedProducts. 
MSI (s) (2C:84) [13:08:10:660]: Skipping FindRelatedProducts action: already done on client side 
Action ended 13:08:10: FindRelatedProducts. Return value 0. 
MSI (s) (2C:84) [13:08:10:660]: Doing action: AppSearch 
Action 13:08:10: AppSearch. Searching for installed applications 
Action start 13:08:10: AppSearch. 
MSI (s) (2C:84) [13:08:10:662]: Skipping AppSearch action: already done on client side 
Action ended 13:08:10: AppSearch. Return value 0. 
MSI (s) (2C:84) [13:08:10:662]: **Doing action: AlreadyUpdated** 
Action 13:08:10: AlreadyUpdated. 
Action start 13:08:10: AlreadyUpdated. 
APS DTE Axiom Server has already been updated to 12.1.1.1582 or newer. 
MSI (s) (2C:84) [13:08:12:420]: Product: APS DTE Axiom Server -- APS DTE Axiom Server has already been updated to 12.1.1.1582 or newer. 

Action ended 13:08:12: AlreadyUpdated. Return value 3. 

Таким образом, мы можем видеть, что FindRelatedProducts пытались дважды выполнить, но AlreadyUpdated CA выполняется только с второй попытки. В учебниках ничего не говорится о размещении этого центра сертификации в InstallUISEquence. Нужно ли это, или, может быть, это не хороший подход, если его нет? Или вы можете рекомендовать лучшее решение этой проблемы?

ответ

3

Повторите раздел InstallExecuteSequence для InstallUISequence. Вы хотите, чтобы проверки происходили во время диалогов, поэтому они являются частью InstallUISequence. Вы также хотите, чтобы они возникали во время InstallExecuteSequence, если пользователь делает тихую установку, пропуская пользовательский интерфейс.

<InstallUISequence> 
    <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom> 
    <Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom> 
<InstallExecuteSequence> 

<InstallExecuteSequence> 
    <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom> 
    <Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom> 
<InstallExecuteSequence> 
+2

Вы также можете добавить атрибут Execute = 'firstSequence' в элемент CustomAction, чтобы он выполнялся только один раз - в InstallUISequence, если у установки есть обычный пользовательский интерфейс или InstallExecuteSequence, если он тихий. – imagi

+0

Спасибо! Теперь я понимаю, для чего нужны эти две записи –

1

Вместо этого использовать MajorUpgrade.

+0

Фактически сейчас это серьезное обновление. Но я думаю, что это неважно, большой или второстепенный для этой проблемы. –

+1

Да, это серьезное обновление, и если вы используете элемент MajorUpgrade, WiX позаботится обо всех сообщениях об ошибках и тому подобное. –