使用Windows安装程序了解GUIDS,更新和修补程序

时间:2009-11-18 17:52:30

标签: wix windows-installer guid msi-patch

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

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

2 个答案:

答案 0 :(得分:4)

  

如果组件GUID发生变化,但是       相同的文件在组件中,       重大升级会发生什么?

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

其次,问题是是否将安装新组件。仅在缺少其keypath时才安装组件。如果密钥路径是版本化文件,则较低版本也会计为“缺失”。

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

  

如果从a中删除某个组件   产品,会发生什么   主要升级的相关文件?   是否删除了原始文件   卸载?

除非您在Upgrade table中放入正确的条目,并且InstallExecuteSequence告诉Windows安装程序删除旧产品,否则旧组件将保持不变。请参阅Alex Shevchuk的blog post以获取有关如何在wix中创建删除旧版本的安装程序的指导。

  

我说的是一个专业吗?   升级将替换所有文件   组件......

没有。这取决于是先删除旧组件,是否根据密钥路径安装了新组件,以及文件版本控制规则。

  

假设部署了产品   没有使用安装程序的机器。   如果您随后创建了一个安装程序   组件中具有相同名称的文件   就像安装目录中的内容一样   如果你这些文件会发生什么   试过安装?

同样,它取决于组件是否安装,具体取决于其密钥路径和文件版本控制规则。

  

如果我使用的话我是否正确   像热一样的工具来创建一个xml文件   包含目录中的所有文件   (就像网站一样),你有   保持GUID相同(手动   或者用脚本),或者你只是   能够进行重大升级吗?

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

答案 1 :(得分:3)

了解Component Rules。它们很容易破解,Windows Installer不会强制执行它们。但是,如果你不遵守规则,那就会发生奇怪的奇怪伏都教。

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

如果Windows安装程序在安装期间在磁盘上找到了一个文件,它将增加该文件的引用计数,假设它是一个“共享”文件。只有在引用计数返回到零时才从磁盘中删除文件,因此如果文件已经存在,则计数可能永远不会返回到零,即使卸载后也可以保留文件。