繁体   English   中英

MSI主要升级覆盖规则

[英]MSI Major Upgrade overwriting rules

我想我在某个地方读过它,但现在找不到源代码并且无法确认它:当安装(主要升级)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:到目前为止,我可以确认在InstallFiles之后移动RemoveExistingProducts将保留修改的无版本文件。 但问题是看起来MajorUpgrade冲突

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

我正在添加,错误消息是

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

这也不是很有帮助。

最后更新:在挖掘Web事物一段时间后,找出问题所在:

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

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

资料来源: Wix Toolset网站

所以包括MajorUpgrade确实会为你改变RemoveExistingProducts序列,这是一个有用的功能,但对我来说是意想不到的。 感谢所有的帮助,现在开始对我有意义了。 毕竟是一个幸福的结局!

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

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

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

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

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

这可能很有用:

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

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

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

这篇文章可以帮助你实现同样的目标。

我不能评论,因为缺乏声誉,但如果你想添加

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

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

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

我的猜测是行为的改变是因为你在InstallExecuteSequence的早期移动了RemoveExistingProducts

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

这是一个处理确保在更新期间更新未版本控制文件的线程: 强制升级在初始安装期间修改的文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM