[英]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意味着“没有文件资源中的文件版本”。
我不能评论,因为缺乏声誉,但如果你想添加
<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.