2010-11-30 3 views
2

У нас есть пользовательское действие, которое мы хотим запустить ТОЛЬКО при крупном обновлении. Проблема в том, что CA откладывается, потому что ему нужен доступ к системным файлам (он удаляет старую версию программы из INI-файла). Поскольку CA отложен, он имеет доступ только к свойству CustomActionData.Wix: Условное отложенное пользовательское действие

Итак, моя первая попытка состояла в том, чтобы установить CustomActionData, если UPGRADINGPRODUCTCODE был истинным, а затем установить CA, который фактически обновил CustomActionData. Это не удалось - CustomActionData не был установлен, я предполагаю, потому что только в пределах пользовательское действие и не используется в качестве условия для пользовательского действия.

Вот СА я определил:

<CustomAction Id="MyCA.SetProperty" Return="check" Property="MyCA" 
    Value="[UPGRADINGPRODUCTCODE]" /> 

    <CustomAction 
     Id="MyCA" 
     BinaryKey="MyIniProcessingProgram" 
     ExeCommand="MyArgs" 
     Execute="deferred" 
     Impersonate="no" 
    Return="ignore"/> 

А вот мой InstallExecuteSequence:

<RemoveExistingProducts After="InstallValidate" /> 
<Custom Action="MyCA.SetProperty" Before="InstallFinalize"/> 
<Custom Action="MyCA" After="MyCA.SetProperty"> 
    CustomActionData 
</Custom> 

Я также попытался:

  • Создание MyCA.SetProperty обусловливающие UPGRADINGPRODUCTCODE, то планирование MyCA после него - не работает, потому что даже если MyCA.SetProperty не запускается, действие «После».

Было бы лучше, если бы мы могли избежать действий JavaScript/VBScript или прибегать к проверке значения CustomActionData в самой программе обновления INI; идея состоит в том, чтобы сделать CA сам условным, поэтому мы не запускаем его, если условие (основное обновление) не является истинным.

ответ

1

Почему бы не использовать это пользовательское действие:

<CustomAction 
     Id="MyCA" 
     BinaryKey="MyIniProcessingProgram" 
     ExeCommand="MyArgs" 
     Execute="deferred" 
     Impersonate="no" 
Return="ignore"/> 

с этим InstallExecuteSequence?

<Custom Action="MyCA" After="InstallValidate"> 
     UPGRADINGPRODUCTCODE 
</Custom> 

Пожалуйста, обратите внимание, что UPGRADINGPRODUCTCODE устанавливается в пакете, который модернизируется, поэтому он доступен только в процессе удаления старой версии.

Если вы хотите, чтобы обнаружить обновления в новой версии, вы можете использовать столбец ActionProperty в Upgrade таблице: http://msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx

В принципе, вам нужно определить правила обновления для старых и новых версий: http://wix.sourceforge.net/manual-wix2/wix_xsd_upgradeversion.htm

Таким образом, вы можете обнаружить старые версии с помощью настраиваемого свойства. Это свойство затем можно использовать для условий вашего пользовательского действия.

+0

Ahh, неудивительно, что у моей новой версии никогда не было UPGRADINGPRODUCTCODE. Я думал, что это связано с тем, что действие было отложено, но это просто потому, что это свойство задано только в версии _be upgrade. Спасибо, что указали мне на ActionProperty, что позволило мне легко решить мою проблему. – 2010-12-03 21:57:41

0

Условия, используемые для закрытия любого действия (включая отложенные), являются условиями последовательности. Это означает, что вы можете использовать UPGRADINGPRODUCTCODE непосредственно как часть условия даже при отложенном действии.

Когда установщик достигнет этой последовательности в течение ближайшей фазы, он будет оценивать условие и назначать отложенное выполнение, если условие истинно. Затем, когда он запускает отложенную последовательность, он будет запускать все действия, которые были запланированы на ближайшей фазе.

+0

Это правда, планирование не было проблемой, я просто ссылался на неправильное свойство - спасибо! – 2010-12-03 21:58:43

Смежные вопросы