首页 文章

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

提问于
浏览
0

我想知道是否有任何方法可以使用较新版本的产品覆盖旧文件 . 有几百个文件,所以有更好的方法吗?由于升级完全消除了所有文件 . 我想升级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 回答

  • 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?

    Important! 补丁只是已作为完整包工作的MSI升级的交付方法 . 唐't waste any time generating patches until you have verified that the full, updated MSI package upgrades the previous version correctly. You will just waste time if you do - the patch will never work if the full update doesn'吨工作 . 它不能 .

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

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

相关问题