5

(编辑:问题改变了。)

我有一个带有安装程序的产品,该安装程序由 InstallShield 2010 构建,并且所有帐户似乎都可以作为“新”安装进行安装。

我会定期更改安装的内容,用错误修复等方式更新这个或那个组件。在那些时候,我尝试更改已更新文件元数据中的版本号,但有些组件是不可能的。当然,他们总是以最近的修改日期结束。我也在 MSI 数据中更改了产品的版本号。但是,我并没有每次都更改包代码。

当一些用户在我的产品已经存在的系统上运行安装程序时,系统会提示他们更新模式 UI(“您要更新吗?”等),并且安装程序似乎已完成。但是,更新的文件并不总是覆盖旧文件,直到之后运行“修复”安装,特别是如果版本号没有更改,并且现在有证据表明使用“强制覆盖”标记组件的内容不会不要改变这种行为。

这里发生了什么?有什么办法可以得到更好的结果吗?每当我更新产品或更新组件时,包代码是否需要更改?(编辑:每次我构建版本时,包代码都会改变,所以这不是问题的原因。)

编辑:这是一个更新用户界面,但更新后的维护是实际完成所需安装的内容。

4

4 回答 4

3

您当然应该在每次构建时更改 PackageCode。事实上,默认情况下,InstallShield 有一个构建设置可以做到这一点。

事实上,MSDN 帮助主题Package Codes说:

不同的 .msi 文件不应具有相同的包代码。更改包代码很重要,因为它是安装程序用于搜索和验证给定安装的正确包的主要标识符。如果在未更改包代码的情况下更改包,则安装程序可能不会使用较新的包(如果安装程序仍可访问这两个包)。

这就是您获得维护 UI 体验而不是升级体验的原因。

现在,一旦您开始执行此操作,接下来您将不得不考虑是否要支持次要升级、主要升级或补丁来为您的应用程序提供服务。在将安装程序投入生产之前,了解这一点并测试您的策略非常重要。

于 2011-01-15T00:22:12.077 回答
2

在上面@ChristopherPainter 的回答中,我也了解到 InstallShield 有一个自动生成包代码的设置,但他没有说它在哪里。所以对于其他寻找它的人:

此设置位于媒体/发布/(发布名称)、产品配置、常规选项卡下。在那里你会找到“生成包代码”,你可以验证它是否设置为是。

于 2014-07-02T15:21:02.933 回答
1

根据不变的文件版本信息,安装程序正在做它应该做的事情。

理想情况下,您每次更改文件时都更新文件版本(对于完全包含版本信息的文件),但如果出于某种原因您不打算这样做,仍然有几种方法可以强制更新组件。

简单的方法是设置 REINSTALLMODE 属性。您可以将其设置为“amus”,这将导致重新安装所有文件。请参阅 MSDN - http://msdn.microsoft.com/en-us/library/aa371182%28v=vs.85%29.aspx

这行得通,但可能会引入它自己的问题。例如,如果您在包中包含一些可再发行组件,则强制重新安装这些可再发行组件可能会导致它们被降级。

允许您在单个组件级别进行控制的更难的方法是使用自定义操作。调用 MsiSetComponentState 将每个组件显式设置为您想要的任何状态。 http://msdn.microsoft.com/en-us/library/aa370383%28v=VS.85%29.aspx

我记得您的自定义操作必须在 CostFinalize 之后进行,因此安装程序不会清除您的更新。

于 2011-01-15T22:58:13.547 回答
0

当 Windows Installer 决定是否安装您的组件时,它将首先查看“keypath”资源是否已经存在。如果是,则不会安装组件中的任何资源。(我假设 Installshield 将每个文件放在它自己的组件中,并且 keypath 是文件。)

当 keypath 资源是版本化文件时,Windows Installer 只有在找到具有相同或更高版本的文件时才会认为它存在。因此,如果已经存在具有相同版本号的文件,则不会再次安装它。因此,在不更改版本号的情况下更改文件会导致问题。

编辑:关于修复解决问题的原因:我相信它会重新安装缓存的 MSI 文件中的所有组件,c:\windows\installer无论 keypath 资源的存在/版本如何。这似乎是合乎逻辑的,因为这是确保恢复损坏的文件的唯一方法。(我无法立即在 MSDN 上找到明确的参考资料来支持这一点,抱歉。)

TortoiseSVN 开发人员在博客中提到了从 1.6.10 之前的版本升级到更高版本时 TortoiseSVN 中的类似问题。在他的案例中,问题不在于文件的版本,而在于某些组件的 keypath 发生了变化,结果相同。在这种情况下,修复也修复了应用程序。

于 2011-01-15T01:35:03.807 回答