gpt4 book ai didi

wix - MSI 主要升级覆盖规则

转载 作者:行者123 更新时间:2023-12-02 15:51:19 25 4
gpt4 key购买 nike

我想我在某处读过它,但现在无法找到源代码并且无法确认它:当从 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>

安装执行序列

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:到目前为止,我可以确认在 InstallFiles 之后移动 RemoveExistingProducts 将保留修改后的未版本化文件。但问题是,似乎 MajorUpgrade

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

我正在添加,错误信息是

Error 1 Duplicate symbol 'WixAction:InstallExecuteSequence/RemoveExistingProducts' found. This typically means that an Id is duplicated. Check to make sure all your identifiers of a given type (File, Component, Feature) are unique. C:\TestDev\MySetupTest\MySetupTest\Product.wxs 5 1 MySetupTest

这也不是很有帮助。

最终更新:经过一段时间的研究,找出问题所在:

By default, MajorUpgrade schedules RemoveExistingProducts after InstallValidate. You can change the scheduling using the Schedule attribute. For example, If you choose to schedule it after InstallInitialize, it will look like the following:

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

来源:Wix Toolset website

因此,包含 MajorUpgrade 确实会为您更改 RemoveExistingProducts 序列,这是一个有用的功能,但对我来说是出乎意料的。感谢您的所有帮助,现在事情开始对我来说有意义了。毕竟是一个幸福的结局!

最佳答案

当重大升级在安装新版本之前卸载现有安装(在 InstallInitialize 之前删除现有产品)时,它通常会删除最初安装的所有文件 - 这包括可能已修改的文件。然后使用新的文件包安装新版本。

如果您在InstallFinalize 之后计划RemoveExistingProducts,则新版本文件的安装将先于删除过时的文件。在这种情况下,只有当文件经过版本控制且比已安装的文件更新时,文件才会被替换,对于未版本化的文件(例如 txt、pdf 等)...文件替换规则基本上规定,只有在文件未更改时才会被覆盖磁盘。

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

关于wix - MSI 主要升级覆盖规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com