WiX - значительное обновление при установке нескольких экземпляров

Итак, у меня есть служба Windows, которая может иметь несколько экземпляров, установленных на одном сервере. Установщик должен иметь возможность обновить один экземпляр. Установщик использует Instance Transforms, но я не уверен, как заставить работать крупные обновления так, как мне бы хотелось.

Для серьезного обновления, чтобы работать, я понимаю, что мне нужно изменить код продукта, поэтому экземпляры определяются в этой форме:

<Instance ProductCode="*"
            UpgradeCode="{SOMEGUID}"
            ProductName="Instance 1"
            Id="Instance1"/>

Msi может быть запущен для установки нового экземпляра:

msiexec.exe /i "installer.msi" TRANSFORMS=:Instance1 MSINEWINSTANCE=1

Однако после долгих поисков я обнаружил, что единственный способ запустить обновление для конкретного экземпляра - это следующий формат:

msiexec.exe /i "installer.msi" /n {PRODUCTCODE} REINSTALL=ALL REINSTALLMODE=vamus

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

Есть ли способ запустить обновление, используя вместо этого UpgradeCode или InstanceID экземпляра или ProductCode? Так как оба из них останутся статичными. Или же я могу запустить MSI без аргументов, выбрать существующий экземпляр (с помощью проверки реестра) в диалоговом окне пользовательского интерфейса и установить соответствующие свойства, чтобы принудительно установить MSI в режим обновления для этого экземпляра?

2 ответа

Решение

Вот что я сделал до сих пор для обновления трех отдельных экземпляров:

<InstanceTransforms Property="Upgrade">
  <Instance Id="I01" ProductCode="*"  ProductName="Product Instance 1" UpgradeCode="55a25a09-5979-438d-91dd-67755012a288"/>
  <Instance Id="I02" ProductCode="*" ProductName="Product Instance 2" UpgradeCode="a27eb2e5-9aa8-4d09-b6c0-df717875c310"/>
  <Instance Id="I03" ProductCode="*" ProductName="Product Instance 3" UpgradeCode="d705720d-3703-4b17-817e-bd51edd9abea"/>
</InstanceTransforms>

В то время как моя собственность Upgrade является фиксированной Guid. Благодаря этому я могу обрабатывать 3 экземпляра с их обновлениями отдельно, используя эту строку - для новых установок добавьте MSINEINSTANCE = 1-:

msiexec / i MyProduct.msi MSINEWINSTANCE = 1 преобразование =":I01"

Уверен, вам нужен код продукта для этого, так как код обновления идентифицирует семейство продуктов, а не один.

Запустите PowerShell и выполните эту команду, чтобы получить список установленных продуктов с кодом продукта:

Get-WmiObject -Class win32_product

Вот другой способ получить выходные данные в табличном формате (IdentifyingNumber - ProductCode):

Get-WmiObject Win32_Product | Format-Table IdentifyingNumber, Name, Version

Вы также можете найти код продукта в таблице свойств скомпилированного MSI с помощью Orca ( инструмент MSI SDK):

Другие вопросы по тегам