Wix: условное отложенное пользовательское действие - PullRequest
2 голосов
/ 30 ноября 2010

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

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

Вот те CA, которые я определил:

  <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 условным, поэтому мы не запускаем его, если условие (значительное обновление) не выполняется.

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

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

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

с этой InstallExecuteSequence?

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

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

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

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

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

0 голосов
/ 02 декабря 2010

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

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

...