我想我在某个地方读过它,但现在找不到源代码并且无法确认它:安装(主要升级)来自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.">
所以包括MajorUpgrade
确实会改变RemoveExistingProducts
序列,这是一个很有用的功能,但对我来说却是意想不到的。感谢所有的帮助,现在开始对我有意义了。毕竟是一个幸福的结局!
答案 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