RemoveExistingProducts

RemoveExistingProducts

我想我在某处读过它,但现在找不到源,也无法确认:从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." />


组件定义:

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


InstallExecutesequence

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


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

我使用的是当前稳定的Wix 3.8,是否错过了某些东西?

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

  <InstallExecuteSequence>
      <RemoveExistingProducts After="InstallExecute" />
    </InstallExecuteSequence>


我正在添加,错误消息是


错误1符号重复
找到“ WixAction:InstallExecuteSequence / RemoveExistingProducts”。这个
通常表示ID是重复的。检查以确保所有
给定类型(文件,组件,功能)的标识符为
独特。 C:\ TestDev \ MySetupTest \ MySetupTest \ Product.wxs 5 1 MySetupTest


这也不是很有帮助。

最终更新:
挖掘了一段时间之后,找出问题所在:


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


<MajorUpgrade
  Schedule="afterInstallInitialize"
  DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">


资料来源:Wix Toolset website

因此,包含MajorUpgrade的确会为您更改RemoveExistingProducts顺序,这是一个有用的功能,但对我来说是意外的。感谢您的所有帮助,现在开始对我来说很有意义。毕竟是幸福的结局!

最佳答案

当重大升级在安装新版本之前(InstallInitialize之前的RemoveExistingProducts)卸载现有安装时,通常会删除所有最初安装的文件-包括可能已被修改的文件。然后,将使用新的文件包安装新版本。

如果您在InstallFinalize之后计划RemoveExistingProducts,则在删除过时的文件之前先安装新版本的文件。在这种情况下,仅当文件的版本和已安装的文件版本更高时才被替换,对于txt,pdf等未版本化的文件...文件替换规则基本上规定,仅当文件未更改时才会覆盖该文件。磁盘。

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

关于wix - MSI主要升级覆盖规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22160392/

10-10 18:12