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你的顺序,这是一个有用的功能,但对我来说是出乎意料的。感谢所有的帮助,现在事情开始对我有意义。毕竟是幸福的结局!
当主要升级在安装新版本之前卸载现有安装时(在 InstallInitialize 之前删除现有产品),它通常会删除最初安装的所有文件 - 这包括可能已修改的文件。然后,新版本将与新的文件包一起安装。
如果您在 InstallFinalize 之后计划删除现有产品,则新版本文件的安装将先于删除过时的文件。在这种情况下,只有当文件经过版本控制且比已安装的文件更新时,文件才会被替换,对于未版本化的文件(例如 txt、pdf 等)...文件替换规则基本上规定,只有在文件未更改时才会被覆盖磁盘。
因此,在InstallFinalize之后移动RemoveExistingProducts可能会解决您的文件“替换问题”,这实际上是在您当前的升级策略卸载和重新安装期间删除修改的文件的情况。