Wix - MSI升级,无需删除旧版本

时间:2017-07-21 08:01:33

标签: wix windows-installer upgrade

我想知道是否有任何方法可以使用较新版本的产品覆盖旧文件。有几百个文件,所以有更好的方法吗?由于升级完全消除了所有文件。我希望升级MSI覆盖文件。

我的升级逻辑如下:

<Upgrade Id="$(var.UpgradeCode)">
      <UpgradeVersion Minimum="$(var.ProductVersion)"
                      IncludeMinimum="no"
                      OnlyDetect="yes"                        
                      Property="NEWPRODUCTFOUND" />
      <UpgradeVersion Minimum="$(var.RTMProductVersion)"
                      IncludeMinimum="yes"
                      Maximum="$(var.ProductVersion)"
                      IncludeMaximum="no"                         
                      Property="UPGRADEFOUND" />
</Upgrade>

<CustomAction Id="PreventDowngrading" Error="Newer version already installed" />

<InstallUISequence>
  <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
</InstallUISequence>

<InstallExecuteSequence>
  <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
  <RemoveExistingProducts After="InstallFinalize" />      
  <InstallExecute After="RemoveExistingProducts"  />
</InstallExecuteSequence>

1 个答案:

答案 0 :(得分:1)

我需要快速写下来,请耐心等待,但请点击这里:

组件GUID必须在软件包之间保持相同才能正确更新文件,尤其是在通过修补程序进行部署时。部署GUID不匹配的关键症状是部署完成后完全丢失文件(以及永不工作的补丁)。

按照PhilDW的说明设置正确的主要升级,并保持发行版之间的组件GUID一致,并遵循组件创建规则,升级应该正常(以及您的补丁)。

请注意,您可以将组件GUID保留在WiX源文件之外,并允许它们自动生成而不是硬编码,您仍然可以获得一致的GUID。除非您重命名或移动有问题的文件,否则自动生成GUID将calculate a stable GUID(请阅读链接的问题,接受的答案及其所有注释)在版本之间保持稳定 - 这需要新的组件GUID,并且here is why(这也解释了为什么可以自动生成稳定的GUID)。自动GUID生成将检测何时需要新的GUID。

我无法通过heat.exe快速收获,但我认为它允许组件GUID自动生成而不是硬编码。只需更改脚本或自动化过程即可将组件GUID设置为自动生成(这在组件标记中使用*而不是GUID)。请阅读整个答案以及所有答案和评论: Syntax for guids in WIX?

重要!补丁只是MSI升级的交付方式,已经作为完整包使用。在您确认完整,更新的MSI软件包正确升级以前的版本之前,不要浪费任何时间生成补丁。如果你这样做,你将浪费时间 - 如果完整更新不起作用,补丁将永远不会工作。它不能。

您的产品的第一个版本是否有效?如果不是,我会建议从头开始并使用自动生成的GUID。如果您的先前版本是实时的并且您有硬编码组件GUID,则需要将第一个版本中的现有组件GUID与更新版本中的组件GUID匹配,或者您必须按照zett42建议的InstallExecuteSequence早期放置RemoveExistingProducts以允许旧版本在安装新版本之前完全卸载。这将防止组件引用中的先前错误影响主要升级,并且升级后不应丢失任何文件。 由于组件引用不正确,因此无法在此方法中进行修补。这使得次要和主要升级修补都失败 - 两者都需要100%的组件引用才能正常工作。

这已经很久了。如果这听起来都是希腊语,请阅读链接的stackoverflow答案,并了解MSI组件创建最佳实践和组件引用。有关此信息,请参阅MSDN。我会回来看看你是如何继续下去的,一旦我知道什么不清楚以及你在哪里,我可能会稍微清理一下这个答案。