MSI主要升级覆盖规则

时间:2014-03-04 00:21:54

标签: wix windows-installer

我想我在某个地方读过它,但现在找不到源代码并且无法确认它:安装(主要升级)来自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,目前的稳定版,我错过了什么吗?

UPDATE2: 到目前为止,我可以确认在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序列,这​​是一个很有用的功能,但对我来说却是意想不到的。感谢所有的帮助,现在开始对我有意义了。毕竟是一个幸福的结局!

5 个答案:

答案 0 :(得分:2)

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

如果在InstallFinalize之后安排RemoveExistingProducts,则在删除过时文件之前安装新版本的文件。在这种情况下,文件仅在版本化且比安装文件更新时才被替换,对于未版本化的文件(如txt,pdf等)...文件替换规则基本上表明文件只有在未更改时才会被覆盖磁盘。

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

答案 1 :(得分:2)

正如所指出的那样,您的REP在序列的早期阶段,因此它基本上是对所有旧产品的卸载,然后安装新产品。这是一种主要升级。

另一种主要升级是REP在“结束”时。在这种情况下,新产品安装在较旧的产品之上,这将遵循文件替换规则,这是与您的问题相关的部分。

这可能有用:

http://msdn.microsoft.com/en-us/library/aa370531(v=vs.85).aspx

如果未版本控制的文件有哈希检查,则会有不同的规则。是的,unversioned意味着“没有文件资源中的文件版本”。

答案 2 :(得分:1)

你所说的行为是unversioned file replacement logic 将配置文件放在其自己的组件中并将配置文件标记为组件的关键路径将确保Windows Installer在决定是否在安装新版本时替换此文件时将使用无版本文件替换逻辑。

post可以帮助您实现相同目标。

答案 3 :(得分:1)

由于缺乏声誉,我无法评论,但如果你想添加

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

如果你有重复错误,你应该试试这个;

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." Schedule="afterInstallExecute" />

答案 4 :(得分:0)

我的猜测是,行为的变化是因为您在 InstallExecuteSequence 的早期移动了 RemoveExistingProducts

主要升级基本上是对原始产品进行卸载,然后重新安装新产品。如果InstallExecuteSequence中的RemoveExistingProducts延迟 - 并且组件引用正确完成 - 现有产品不会先卸载,但在安装新产品后会删除其“剩余”组件。如果你愿意,它就像一个“差异”。这将保留磁盘上未在新版本中删除的已安装文件。我希望这是可以理解的 - 很快就可以理解,并且匆忙。

这是一个处理确保在更新期间更新未版权化文件的线程:Forcing an upgrade of a file that is modified during its initial installation