2009-11-18 91 views
9

我了解Windows的安装程序和维克斯,并有一些相关的问题,它是如何工作:了解GUIDS,更新和修补程序与Windows的安装程序

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

所有这些都很容易测试。 – 2009-11-18 18:00:10

回答

4

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

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

其次,问题是是否将安装新组件。只有在缺少keypath时才安装组件。如果keypath是一个版本化文件,那么较低的版本也算作“丢失”。

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

如果组件从 产品去除,会发生什么情况 相关文件上的重大升级? 原始文件在 上被删除吗?

除非你把Upgrade table正确条目和InstallExecuteSequence告诉Windows安装程序删除旧产品,旧的组件将被单独留在家中。请参阅Alex Shevchuk的blog post以获取有关如何在wix中创建用于删除旧版本的安装程序的指导。

我的意思是说主要的 升级将替换所有 组件中的所有文件...

不需要。它取决于旧组件是否先被删除,是否已安装新组件(取决于密钥路径)以及文件版本规则。

假设产品部署在 机器上而不使用安装程序。 如果您随后创建了一个安装程序,其中 组件 中的同名文件与安装的目录中的内容相同 如果您尝试安装 ,那么这些文件会发生什么变化?

同样,这取决于是否安装了组件,具体取决于它们的keypath和文件版本控制规则。

上午我说,如果我用 喜欢热的工具在目录 创建一个XML文件 的所有文件(比如一个网站),那你就必须 保持正确的GUID相同(手动 或脚本),或者只有 能够进行重大升级?

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

3

了解Component Rules。它们很容易中断,Windows Installer不强制执行它们。但是,如果你不遵守规则,那么怪异的巫术就会发生。

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

如果Windows安装程序在安装期间发现磁盘上已存在文件,假定它是一个“共享”文件,该文件的引用计数。一旦引用计数返回到零,文件只能从磁盘中删除,因此如果文件已经存在,则计数可能永远不会返回到零,并且即使在卸载之后,也可以将文件留在左边。

+0

关于引用计数:并不那么简单。如果您有两个安装相同文件的不同组件(违反组件规则),则删除一个组件将删除该文件。如果文件具有“sharedllrefcount”,只有在已经存在refcount的情况下才由Windows Installer更新的传统机制,或者在SharedDllRefCount =“Yes”的组件上显式启用该文件,该文件才具有一些额外的保护。 – 2009-11-19 00:37:20

+0

诚然,如果您违反组件规则,则所有投注均关闭;) – saschabeaumont 2009-11-20 03:38:20

相关问题