【问题标题】:Odd MSI Component Rules奇怪的 MSI 组件规则
【发布时间】:2013-11-15 15:43:07
【问题描述】:

我的安装程序在安装时似乎没有遵循 MSI 组件规则。这是场景:

操作系统:Windows 7 x64

产品 A 将一组附加到 guid 为“123ABC”的组件的文件安装到 C:\Program Files\Common Files\Foo。该组件具有以下文件:
foo.dll,版本 1.0.0.0,(KeyPath)
foo.sys,版本 1.0.0.0
foo.inf,没有版本
foo.cat,没有版本

产品 B 将附加到同一组件 guid“123ABC”的同一组文件安装到同一路径 C:\Program Files\Common Files\Foo。该组件具有以下文件:
foo.dll,版本 1.0.0.1,(KeyPath)
foo.sys,版本 1.0.0.0
foo.inf,没有版本
foo.cat,没有版本

先安装产品 A,产品 B 不执行产品 A 的升级,它们只是共享一个包含组件“123ABC”的公共 MSM。我的期望是,当安装产品 B 时,MSI 将比较 foo.dll 的 keypath 版本并确定产品 B 的 foo.dll 更新。然后与组件“123ABC”关联的所有四个文件将覆盖磁盘上由产品 A 安装的现有文件。这不会发生 :( 相反,这是生成的文件集:
C:\Program Files\Common Files\Foo
foo.dll,版本 1.0.0.1(来自产品 B)
foo.sys,版本 1.0.0.0(来自产品 A)
foo.inf,无版本(来自产品 A)
foo.cat,无版本(来自产品 B)

只有 dll 和 cat 文件被覆盖。从 msi 日志文件中,我可以看到以下内容:

MSI (s) (4C:F0) [17:29:24:227]: File: C:\Program Files\Common Files\Foo\foo.dll;    Overwrite;  Won't patch;    Existing file is a lower version
MSI (s) (4C:F0) [17:29:24:305]: File: C:\Program Files\Common Files\Foo\foo.sys;    Won't Overwrite;    Won't patch;    Existing file is of an equal version
MSI (s) (4C:F0) [17:29:24:305]: File: C:\Program Files\Common Files\Foo\foo.inf;    Won't Overwrite;    Won't patch;    Existing file is unversioned and unmodified - hash matches source file
MSI (s) (4C:F0) [17:29:24:335]: File: C:\Program Files\Common Files\Foo\foo.cat;    Overwrite;  Won't patch;    Existing file is unversioned and unmodified - hash doesn't match source file

我认为 MSI 组件根据是否要安装密钥路径来安装所有相关文件。什么会导致与同一组件关联的每个文件都被单独比较?

【问题讨论】:

  • 将合并模块中的组件标记为共享并重新构建并重新测试。
  • 你说的是msidbComponentAttributesShared还是msidbComponentAttributesSharedDllRefCount?无论哪种方式,我都看不到哪种设置会为我买单?此外,我们使用的是 MSI 3.0。

标签: windows installation windows-installer


【解决方案1】:

Keypath 状态决定了一个组件是否会被操作。然后组件内的资源遵循它们的规则:例如,文件遵循file versioning rules

【讨论】:

  • 我想我只是有一个不正确的组件/文件版本控制规则模型。感谢您的澄清。
  • 也许是一个愚蠢的问题(在谈论 Keypath state 之前):将具有 相同 ComponentId 的两个组件视为 一个(相同的)组件?
【解决方案2】:

假设每个产品都使用默认成本计算规则 (OMUS) 包含共享组件的合并模块应该可以工作。 FWIW,您可能需要考虑制作一个使用此合并模块的 MSI,然后将其添加到两个产品的引导程序中。通过这种方式,补丁服务可以更干净。

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2021-06-10
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多