Как выполнить условное пользовательское действие только при установке и изменении? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть установщик, который работает нормально.Я хочу запускать пользовательские действия только при установке и изменении.Вот мое настраиваемое действие:

<Custom Action="UpdateAPMDBAPasswordAndStoreInRegistry" After="InstallFinalize"><![CDATA[&BaseModel = 3 OR &FeaturePostMaster = 3]]></Custom>

Вышеуказанное настраиваемое действие не выполняется при изменении установщика.Работает только при установке установщика.После googled я сделал это, но он также не работает:

<Custom Action="UpdateAPMDBAPasswordAndStoreInRegistry" After="InstallFinalize"><![CDATA[(&BaseModel = 3 OR &FeaturePostMaster = 3) AND (NOT Installed OR MaintenanceMode="Modify")]]></Custom>

Он также работает только в режиме установки.Что я делаю не так?

1 Ответ

0 голосов
/ 18 сентября 2018

InstallFinalize : Вы пишете в HKCU или HKLM? Все, что упорядочено после InstallFinalize, не будет работать с повышенными правами в управляемой среде и, следовательно, не будет работать во время установки, если вы попытаетесь записать в HKLM (если вы не измените ACL для ключа вы пишете в - или вы запускаете MSI из cmd.exe, который уже повышен - не рекомендуется, пакет содержит ошибки).

MaintenanceMode : Это условие выглядит так, как будто оно зависит от Installshield: NOT Installed OR MaintenanceMode="Modify". Я думаю, что Installshield сам устанавливает это свойство MaintenanceMode в проприетарной форме. Следовательно, он вообще недоступен в WiX.

Условия тестирования : Условия могут быть сложными для тестирования, и вам необходимо провести реальное тестирование во многих режимах установки (install, uninstall, repair, modify, patch, major upgrade, self-repair, etc...), чтобы убедиться, что они соответствуют вашему конкретному случаю и работают, как ожидалось. Типичный сценарий, когда люди удивляются кондиционированию, - это серьезные обновления - удаление старой версии и установка новой версии - в моем опыте обнаруживаются неожиданные проблемы с условиями. Часто из-за сложных проблем с секвенированием и того факта, что во время такого обновления выполняются как последовательность удаления старой установки, так и последовательность установки новой установки. Следовательно, ошибочно обусловленные пользовательские действия могут запускаться несколько раз во время основного процесса обновления и вызывать настоящий беспорядок.

Совет по тестированию : Чтобы выполнить быстрое серьезное обновление, необходимо изменить код продукта и увеличить одну из первых 3 цифр версии. И вам нужно иметь элемент MajorUpgrade там. Вы можете установить код продукта для автоматической генерации, установив его на * (я предпочитаю менять его вручную). Скомпилируйте MSI, добавьте суффикс "_Version1", затем выполните указанные обновления и скомпилируйте "_Version2". Запустите процедуру обновления. Вы также должны указать на обновленные файлы для версии 2, изменив исходный путь, но вы можете перейти без него к условиям тестирования.

Изменить : В вашем случае есть шпаргалка от Installshield парней, предлагающих следующее условие в их "MSI Condition Cheat Sheet" :

  • Installed AND NOT REINSTALL AND NOT REMOVE~="ALL"
  • Приведенное выше условие должно разрешать выполнение настраиваемого действия только в операциях изменения. Если вы немного измените его, он должен работать только для установки и изменения:
  • NOT Installed OR ((Installed AND NOT REINSTALL) AND NOT REMOVE~="ALL")

Завтра мне придется выполнить дополнительную проверку этого последнего условия, но я просто опубликую это, чтобы вы могли проверить себя. Я взял патч, но, возможно, мне стоит добавить его обратно, чтобы покрыть основные обновления патча. Будете ли вы доставлять патчи?


Быстрый макет для тестирования условий легкого веса :

The VBScript * * 1092

Примечание! Убедитесь, что файл VBScript находится в UTF8 или ANSI. Unicode не будет работать. Может быть, создать его в блокноте, а не в Visual Studio. У меня возникли проблемы при создании файла VBScript в виде текстового файла WiX, который я затем переименовал в формат *.vbs. Не делай этого.

MsgBox "I run, therefore I am conditioned and sequenced"

WiX Markup, Custom Action

<Binary Id='SayHelloMsgBox.vbs' SourceFile='SayHelloMsgBox.vbs' />
<CustomAction Id='SayHelloMsgBox.vbs' VBScriptCall='' BinaryKey='SayHelloMsgBox.vbs' Execute='immediate' Return='ignore' />

WiX Markup, Sequencing & Conditioning

<InstallExecuteSequence>
   <Custom Action='SayHelloMsgBox.vbs' After='InstallInitialize'>NOT Installed OR ((Installed AND NOT REINSTALL) AND NOT REMOVE~="ALL")</Custom>
</InstallExecuteSequence>
...