多实例安装程序的重大升级
Major upgrade on a multi-instance installer
这个时候我不太愿意问这个问题,因为我要重复WiX - Doing a major upgrade on a multi instance install...但我希望我的问题能得到解答:)
我有一个包含多个实例的安装程序:
<Product Id="{GUID}" UpgradeCode="{GUID}" Version="!(wix.Version)" Name="MyProduct" Manufacturer="MyCompany">
<MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Property Id="INSTANCEID" Value="Default" />
<InstanceTransforms Property="INSTANCEID">
<Instance Id="I01" ProductName="MyProduct_I01" ProductCode="{GUID}" UpgradeCode="{GUID}" />
<Instance Id="I02" ProductName="MyProduct_I02" ProductCode="{GUID}" UpgradeCode="{GUID}" />
.
.
.
<Instance Id="I49" ProductName="MyProduct_I49" ProductCode="{GUID}" UpgradeCode="{GUID}" />
<Instance Id="I50" ProductName="MyProduct_I50" ProductCode="{GUID}" UpgradeCode="{GUID}" />
</InstanceTransforms>
</Product>
为了清楚起见,每个新版本都使用:
- 不同的版本号(前 3 个数字中至少有一个不同)
- 每个实例一个不同的产品代码
- 每个实例使用相同的升级代码
- 我使用域管理员权限安装每个产品
在更改每个新版本的产品代码之前,我对每个版本都使用相同的代码,虽然有点笨拙(永远保留已删除的组件),但重新安装过程成功了。
然而,现在,使用不同版本的后续重新安装会使 msiexec.exe 看到所有组件都丢失,因此安装失败。看来是时候过渡到重大升级了!
天真的方式升级
msiexec.exe /i "installer.msi" /n {OLD_VERSION_PRODUCTCODE}
提示错误信息:
The system administrator has set policies to prevent this installation.
通过重新安装升级
msiexec.exe /i "installer.msi" /n {OLD_VERSION_PRODUCTCODE} REINSTALL=ALL REINSTALLMODE=vamus
(也尝试过 REINSTALLMODE=amus
,因为新产品是新安装的,但不是)
将每个组件记录为不存在且未触及任何文件(报告升级成功):
Installed: Absent; Request: Null; Action: Null
我很茫然——我错过了什么?
我找到了一个尴尬的解决方案,但它只适用于一个尴尬的问题:
<SetProperty Id="REINSTALL" Value="" Before="AppSearch" />
<SetProperty Id="REINSTALLMODE" Value="" Before="AppSearch" />
通过取消设置 REINSTALL
属性,我以某种方式跳过了主要的升级权限障碍并避免了真正的重新安装,留下了新版本。
我很乐意接受更正统的解决方案,特别是不涉及摆弄 Windows 安装程序属性的解决方案...
这个时候我不太愿意问这个问题,因为我要重复WiX - Doing a major upgrade on a multi instance install...但我希望我的问题能得到解答:)
我有一个包含多个实例的安装程序:
<Product Id="{GUID}" UpgradeCode="{GUID}" Version="!(wix.Version)" Name="MyProduct" Manufacturer="MyCompany">
<MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Property Id="INSTANCEID" Value="Default" />
<InstanceTransforms Property="INSTANCEID">
<Instance Id="I01" ProductName="MyProduct_I01" ProductCode="{GUID}" UpgradeCode="{GUID}" />
<Instance Id="I02" ProductName="MyProduct_I02" ProductCode="{GUID}" UpgradeCode="{GUID}" />
.
.
.
<Instance Id="I49" ProductName="MyProduct_I49" ProductCode="{GUID}" UpgradeCode="{GUID}" />
<Instance Id="I50" ProductName="MyProduct_I50" ProductCode="{GUID}" UpgradeCode="{GUID}" />
</InstanceTransforms>
</Product>
为了清楚起见,每个新版本都使用:
- 不同的版本号(前 3 个数字中至少有一个不同)
- 每个实例一个不同的产品代码
- 每个实例使用相同的升级代码
- 我使用域管理员权限安装每个产品
在更改每个新版本的产品代码之前,我对每个版本都使用相同的代码,虽然有点笨拙(永远保留已删除的组件),但重新安装过程成功了。
然而,现在,使用不同版本的后续重新安装会使 msiexec.exe 看到所有组件都丢失,因此安装失败。看来是时候过渡到重大升级了!
天真的方式升级
msiexec.exe /i "installer.msi" /n {OLD_VERSION_PRODUCTCODE}
提示错误信息:
The system administrator has set policies to prevent this installation.
通过重新安装升级
msiexec.exe /i "installer.msi" /n {OLD_VERSION_PRODUCTCODE} REINSTALL=ALL REINSTALLMODE=vamus
(也尝试过 REINSTALLMODE=amus
,因为新产品是新安装的,但不是)
将每个组件记录为不存在且未触及任何文件(报告升级成功):
Installed: Absent; Request: Null; Action: Null
我很茫然——我错过了什么?
我找到了一个尴尬的解决方案,但它只适用于一个尴尬的问题:
<SetProperty Id="REINSTALL" Value="" Before="AppSearch" />
<SetProperty Id="REINSTALLMODE" Value="" Before="AppSearch" />
通过取消设置 REINSTALL
属性,我以某种方式跳过了主要的升级权限障碍并避免了真正的重新安装,留下了新版本。
我很乐意接受更正统的解决方案,特别是不涉及摆弄 Windows 安装程序属性的解决方案...