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