2014-03-04 106 views
3

我想我在某处读过它,但现在找不到源代码,无法确认它:当从MSI安装(主要升级)较新的版本时,如果文件已被修改由安装程序或用户),默认规则是旧文件不会被新版本中的同一个文件替换?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将保留修改的版本文件。但问题是,这似乎与

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

我加入MajorUpgrade冲突,错误消息是

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

这也不是很有帮助。

最后更新: 挖掘网络的东西了一会儿,找出问题是什么:

默认情况下,MajorUpgrade安排RemoveExistingProducts 后InstallValidate。您可以使用Schedule 属性更改计划。例如,如果你选择后 InstallInitialize安排它,它看起来像下面这样:

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

来源:Wix Toolset website

所以包括MajorUpgrade确实会改变RemoveExistingProducts顺序,方便,这是一个有用的功能,但对我来说却是意外的。感谢所有的帮助,现在开始对我有意义。毕竟一个美满的结局!

回答

2

当一个重大升级卸载现有的安装新版本被安装(InstallInitialize前RemoveExistingProducts)之前,通常会删除所有文件最初安装的 - 这包括可能已被修改的文件。然后,新版本将安装一整套新文件。

如果在InstallFinalize之后计划RemoveExistingProducts,则在删除过时的文件之前安装新版本的文件。在这种情况下,文件只会被替换,如果它们是版本化的并且比已安装的文件更新,并且对于未版本化的文件(如txt,pdf等),文件替换规则基本上规定只有在文件未被更改时才会覆盖该文件磁盘。

因此,在InstallFinalize之后移动RemoveExistingProducts可能会解决您的文件“替换问题”,这是在当前升级策略重新安装卸载过程中被删除的修改文件的真实情况。

+0

谢谢Glyzhkof,最后通过更改默认的exe序列来完成它的工作。 –

+2

一个问题,增加了 ',似乎与'MajorUpgrade'元素冲突。当我有两个,它会抱怨'错误找到重复的符号'WixAction:InstallExecuteSequence/RemoveExistingProducts'。这通常意味着Id是重复的。检查以确保给定类型(文件,组件,功能)的所有标识符都是唯一的。 \t C:\ TestDev \ MySetupTest \ MySetupTest \ Product.wxs MySetupTest ' –

+0

我无法在此计算机上进行测试 - 未安装wix。很确定这很容易在Google上找到。重复的符号通常只是同一个唯一标识符的两个实例。 –

1

行为你在说什么是unversioned file replacement logic
将配置文件放置在其自己的组件中并将配置文件标记为组件的关键路径将确保Windows安装程序在决定是否在安装新版本时替换此文件时使用未版本化的文件替换逻辑。

这个post可以帮助你达到同样的效果。

+0

你指的SO帖子中有哪些选项? –

+1

保罗请参阅此链接:http://blogs.msdn.com/b/astebner/archive/2008/10/19/9006538.aspx这可能会帮助你,否则你可以去与第三个选项,SO贴自己有例子第三个选项 – Nimish

+0

感谢您重新指出来自Aaron Stebner的特定链接(它也来自您提及的SO帖子),它的确很好解释。 –

0

我的猜测是,行为的改变是因为您已经移动RemoveExistingProductsInstallExecuteSequence早。

A 主要升级本质上是运行原始产品的卸载,然后重新安装新的。如果RemoveExistingProducts在InstallExecuteSequence中晚了 - 并且组件引用已正确完成 - 现有产品不是首先卸载,但安装新产品后将删除其“剩余”组件。如果你喜欢,它就像一个“差异”。这将保留未在新版本中删除的已安装文件。我希望这是可以理解的 - 很多时候,并且冲上去。

这里是一个线程与保证在更新过程中获得更新版本的文件,涉及:Forcing an upgrade of a file that is modified during its initial installation

+0

什么是'未版本控制的文件',它已被提及几次,但我没有找到该术语的解释?这意味着文件没有版本号(txt,图片)?另外对不起Glyzhkof,我没有看到与我有关的“msi.exec打开帮助选项”主题? –

+0

'RemoveExistingProducts'确实早于'InstallExecuteSequence',但这是我相信的默认序列,它发生在'InstallInitialize'之前。看到我编辑的问题的确切序列。 –

+0

我已更新链接。对不起,我混淆了目标。 –

2

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

其他类型的主要升级是当REP处于“结束”时。在这种情况下,新产品安装在旧产品之上,并且将遵循文件替换规则,这是与您的问题相关的部分。

这可能是有用的:

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

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

1

我不能因为缺少信誉发表评论,但如果你想添加

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

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

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