我正在学习Windows-Installer和Wix,并且有很多与其工作原理相关的问题:
答案 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安装程序在安装期间在磁盘上找到了一个文件,它将增加该文件的引用计数,假设它是一个“共享”文件。只有在引用计数返回到零时才从磁盘中删除文件,因此如果文件已经存在,则计数可能永远不会返回到零,即使卸载后也可以保留文件。