MSI 重大升级覆盖规则

Pau*_*l L 5 windows-installer wix

我想我在某处读过它,但现在找不到来源并且无法确认它:当安装(主要升级)来自 MSI 的较新版本时,如果文件已被修改(由安装程序或用户),则默认规则是旧文件不会被新版本的相同文件替换吗?

我想我也观察到我之前编写的安装程序中的行为,但现在经过一些更改后,似乎它总是会替换旧的修改配置文件!

产品定义:

    <Product Id="*" Name="$(var.ProductName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Advanced Software Solution" UpgradeCode="$(var.UpgradeCode)">
        <Package Id="*"  InstallerVersion="200" Description="The web service installer" Compressed="yes" 
             InstallScope="perMachine"/>
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
Run Code Online (Sandbox Code Playgroud)

组件定义:

<Component Id='WebConfigComp' Guid='GUID'>
        <File Id='WebConfigFile' Name='Web.config' Source='$(var.TheWebService.WCF.TargetBinPath)\Web.Distribution.config'
              KeyPath='yes'>
        </File>
      </Component>
Run Code Online (Sandbox Code Playgroud)

安装执行序列

FindRelatedProducts     25
AppSearch               50
LaunchConditions        100
ValidateProductID       700
myScripts_CA            799
CostInitialize          800
FileCost                900
CostFinalize            1000
MigrateFeatureStates    1200
InstallValidate         1400
RemoveExistingProducts  1401
InstallInitialize       1500
BackupCA    Installed   1501
ProcessComponents       1600
UnpublishFeatures       1800
SchedSecureObjectsRollback_x64  VersionNT > 400 1801
RemoveFiles         3500
RemoveFolders       3600
CreateFolders       3700
InstallFiles        4000
InstallServices VersionNT   5800
SchedSecureObjects_x64  NOT REMOVE~="ALL" AND VersionNT > 400   5801
ConfigureIIs    NOT SKIPCONFIGUREIIS AND VersionNT > 400    5999
RegisterUser        6000
RegisterProduct     6100
PublishFeatures     6300
PublishProduct      6400
InstallFinalize     6600
LunchWCFReadme  NOT Installed   6601
Run Code Online (Sandbox Code Playgroud)

更新:我刚刚创建了一个用于测试的新项目,观察到相同的行为(修改后的文件被更新版本的安装程序替换),而没有更改默认的 InstallExecSequence。这可能意味着即使文件版本控制应该适用,但它实际上并没有影响预期的结果,因为旧版本的删除发生得太早是默认的,正如 Glytzhkof 和 PhilDW 指出的那样。

我正在使用当前稳定版的 Wix 3.8,我错过了什么吗?

更新 2: 到目前为止,我可以确认移动RemoveExistingProducts之后InstallFiles将保留修改后的未版本化文件。但问题是这似乎MajorUpgrade

  <InstallExecuteSequence>
      <RemoveExistingProducts After="InstallExecute" />
    </InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)

我正在添加,错误消息是

错误 1 ​​发现重复符号“WixAction:InstallExecuteSequence/RemoveExistingProducts”。这通常意味着 Id 是重复的。检查以确保给定类型(文件、组件、功能)的所有标识符都是唯一的。C:\TestDev\MySetupTest\MySetupTest\Product.wxs 5 1 MySetupTest

这也不是很有帮助。

最后更新: 在网上挖了一段时间后,找出问题所在:

默认情况下,MajorUpgrade 在 InstallValidate 之后安排 RemoveExistingProducts。您可以使用 Schedule 属性更改计划。例如,如果您选择在 InstallInitialize 之后安排它,它将如下所示:

<MajorUpgrade
  Schedule="afterInstallInitialize"
  DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">
Run Code Online (Sandbox Code Playgroud)

来源:Wix 工具集网站

所以包括 ofMajorUpgrade确实会改变RemoveExistingProducts你的顺序,这是一个有用的功能,但对我来说是出乎意料的。感谢所有的帮助,现在事情开始对我有意义。毕竟是幸福的结局!

Ste*_*mul 2

当主要升级在安装新版本之前卸载现有安装时(在 InstallInitialize 之前删除现有产品),它通常会删除最初安装的所有文件 - 这包括可能已修改的文件。然后,新版本将与新的文件包一起安装。

如果您在 InstallFinalize 之后计划删除现有产品,则新版本文件的安装将先于删除过时的文件。在这种情况下,只有当文件经过版本控制且比已安装的文件更新时,文件才会被替换,对于未版本化的文件(例如 txt、pdf 等)...文件替换规则基本上规定,只有在文件未更改时才会被覆盖磁盘。

因此,在InstallFinalize之后移动RemoveExistingProducts可能会解决您的文件“替换问题”,这实际上是在您当前的升级策略卸载和重新安装期间删除修改的文件的情况。

  • 有一个问题,添加 `&lt;InstallExecuteSequence&gt; &lt;RemoveExistingProducts After="InstallExecute" /&gt; &lt;/InstallExecuteSequence&gt;` 似乎与 `MajorUpgrade` 元素冲突。当我同时拥有两者时,它会抱怨“发现错误 1 ​​重复符号 'WixAction:InstallExecuteSequence/RemoveExistingProducts'”。这通常意味着 ID 重复。检查以确保给定类型(文件、组件、功能)的所有标识符都是唯一的。C:\TestDev\MySetupTest\MySetupTest\Product.wxs 5 1 MySetupTest` (2认同)