9

我正在学习 Windows-Installer 和 Wix,并且有一些与它的工作原理相关的问题:

  1. 如果组件 GUID 更改,但组件中的文件相同,那么在重大升级时会发生什么?文件是否被替换?
  2. 如果从产品中删除组件,重大升级时相关文件会发生什么情况?卸载时会删除原始文件吗?
  3. 我是否正确地说主要升级将替换所有组件中的所有文件,无论文件的程序集版本是否已更改,并且在小更新和次要升级中,它仅在 GUID 相同的情况下替换文件,并且文件的汇编版本已增加?如果文件没有汇编版本,比如 aspx 页面怎么办?
  4. 假设在没有使用安装程序的情况下将产品部署在机器上。如果您随后创建了一个安装程序,组件中的文件与安装目录中的文件同名,那么如果您尝试安装,这些文件会发生什么情况?他们被替换了吗?
  5. 我是否正确地说,如果我使用诸如 heat 之类的工具来创建一个包含目录中所有文件的 xml 文件(例如网站),那么您必须保持 GUID 相同(手动或使用脚本) ,或者您只能进行重大升级?
4

2 回答 2

4

如果组件 GUID 更改,但组件中的文件相同,那么在重大升级时会发生什么?

首先,问题是旧组件是否被卸载。如果您未将升级配置为卸载产品的先前版本,则不会删除该组件(尽管其文件可能会被覆盖)。另见对问题 2 的回答。

其次,问题是是否会安装新组件。仅当缺少其 keypath 时才会安装组件。如果 keypath 是版本化文件,则较低版本也算作“缺失”。

最后,如果新组件被标记为要安装,并且 Windows Installer 遇到与它尝试安装的文件同名的文件,文件版本控制规则将确定是否替换该文件。例如,更高版本的文件不会被降级。

如果从产品中删除组件,重大升级时相关文件会发生什么情况?卸载时会删除原始文件吗?

除非您将正确的条目放在升级表和告诉 Windows 安装程序删除旧产品的 InstallExecuteSequence 中,否则旧组件将被单独保留。有关如何在 wix 中创建删除旧版本的安装程序的指导,请参阅 Alex Shevchuk 的这篇博文。

我是否正确地说重大升级将替换所有组件中的所有文件......

不,这取决于是否先删除旧组件,是否安装新组件取决于 keypath,以及文件版本控制规则。

假设在没有使用安装程序的情况下将产品部署在机器上。如果您随后创建了一个安装程序,组件中的文件与安装目录中的文件同名,那么如果您尝试安装,这些文件会发生什么情况?

同样,这取决于组件是否被安装,取决于它们的键路径和文件版本控制规则。

我是否正确地说,如果我使用诸如 heat 之类的工具来创建一个包含目录中所有文件的 xml 文件(例如网站),那么您必须保持 GUID 相同(手动或使用脚本) ,或者您只能进行重大升级?

正确的。GUID 是组件的标识,因此如果您要更改 GUID,将存在两个组件(在您的产品的旧版本和新版本中)将相同的资源安装到相同的目标位置。根据 MSDN,这是一个禁忌:“永远不要创建两个以相同名称和目标位置安装资源的组件。”

于 2009-11-18T22:50:43.237 回答
3

学习组件规则。它们很容易破解,Windows Installer 不会强制执行它们。但是,如果您不遵守规则,就会发生奇怪的奇怪巫术。

简单的解决方案,每个组件坚持一个文件,并heat与编译时 GUID 生成一起使用(输出Guid="*"使用稳定的算法,它不是随机的)。产生热量的 GUID 是随机的,但candle在编译时生成的 GUID 将是稳定的(基于文件名 + 路径哈希或来自内存的东西)

如果 Windows 安装程序在安装过程中发现磁盘上已经存在一个文件,它将增加该文件的引用计数,假设它是一个“共享”文件。仅当引用计数归零后,文件才会从磁盘中删除,因此如果文件已经存在,则计数可能永远不会归零,即使在卸载后您也可以将文件留在原处。

于 2009-11-18T22:57:59.507 回答