我在InstallShield MSI项目上使用InstallShield 2016,并尝试创建带有Update可执行文件的次要补丁程序包。一切正常,但是注册表值在更新后更改为默认值。
我已经研究过更改REINSTALLMODE字符串,但是对于将来利用注册表项系统来说可能太过局限了。我还阅读了使用AppSearch和RegLocator表将值读入msi属性的信息。我不知道如何使用这些表格,所以这是我不太了解的解决方案。
我想念什么?
谢谢。
答案 0 :(得分:2)
本质 :我写了很多东西,但没有什么比这有意义。让我试着简化一下:
Don't write registry values that your application might change
。这是我可能会做的更好的事情 将来通过应用程序设置管理进行设置:1)
use a custom REINSTALLMODE
不会覆盖此更新上的任何注册表项,然后我会2)
modify the application
至 将HKCU
注册表项复制到新位置,切勿触摸 从那时起,按您的设置进行操作。3)
您还应该update your application to be able to write all HKCU keys for your application if they are missing
-基于只读模板 设置存储在HKLM中-或者您从内部默认设置中写入它们 存储在 application.exe 中。这样,您将来完全不需要设置写入的HKCU设置-修改后的值不会受到干扰。 There are ways to enforce new values - if you need to 。
我也将保留以下内容。
现实世界 :我认为此“ overwrite registry settings on upgrade problem
”是 MSI设计反模式< / strong>。或者,我喜欢这样称呼它:an MSI Festivus Grievance(必须查看视频了解上下文)。
为可靠地避免此问题,我建议您考虑使用此选项:
消除部署注册表设置 : Generally you should not write registry settings from your setup that are ever changed by your application
。
HKLM keys
:我从设置中仅写入 HKLM
中的只读设置,并允许通过来覆盖它们 msiexec.exe
命令行。然后,我会根据业务逻辑和用例的合理性,使用 AppSearch 或自定义操作(或根本不使用)来阅读它们的升级信息。
HKCU keys
:我希望从部署中完全删除较新版本中的所有 HKCU
项,并编写默认注册表项通过应用程序本身-使用其启动顺序。 这从根本上消除了很多部署问题。您甚至可以将已写入注册表中的只读位置的应用程序复制设置复制到其活动的“活动”配置单元中。例如,您从HKLM的只读注册表部分复制默认值。
这是我常用的通用方法,可以“屏蔽”我的应用程序,使其免受针对每个用户数据的部署干扰-无论是HKCU中的注册表项还是基于用户个人资料的注册表项。对于某些应用程序,这是不可能的。例如,那些没有exe启动顺序的文件。
但是,即使您可以使用此方法并删除新MSI中托管注册表项的组件,软件包的卸载和重新安装(在重大升级过程中-您需要删除组件)也将被删除。注册表项,除非您将其设置为永久完全。
有时我得出的结论是,我必须保留旧的组件,然后复制新的组件以写入新的注册表项,或者写入不同的注册表值名称以容纳新的值。
记住属性模式 :尽管对于WiX而非Installshield,Rob Mensching's "Remember Property Pattern"是有关如何使用AppSearch的课程。这个概念在Installshield中是相同的。您可以在维护和升级方案期间使用AppSearch来回读属性,因为这是全新安装。
Rob很好地说明了这种“ 记住模式”的讽刺之处在于,它将如何覆盖您在 msiexec.exe
命令行上指定的任何新值,除非您需要采取措施避免此问题(或者您的方案允许忽略此特定问题-很少这样做)。请阅读全文。
Installshield :在installshield中,您可以在系统搜索视图中定义 AppSearch 条目。此处的对话框在很大程度上应该是不言自明的,因为您只需指定应将设置文件中的哪些注册表项或条目读入您指定要读取的属性中。对话框是“向导”,因此您只需单击它们即可创建AppSearch。
注意!:一个非常常见的烦恼是忘记基于位数(32位和64位)引用正确的注册表配置单元:
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Firefox
至少在我的世界中,这可能会引起一些真实和反复的混乱。这是一个愚蠢的问题,我们大家都希望避免浪费一分钟的时间。
您可以实施Rob建议的自定义操作,以避免AppSearch清除命令行中传入的属性值。或者我想您可以忽略是否应该从命令行设置有问题的属性?我想这是可能的。
自定义操作方法 :我不喜欢这些,但我会简要地提及它们。
Write Registry Settings With Custom Actions
:有些人喜欢直接通过自定义操作来编写注册表设置,因为这样他们便可以向自定义操作中添加逻辑以在写入新值时请,否则请将msiexec.exe远离这些值,并且切勿意外重置它们。从逻辑上讲,这并不是最糟糕的方法,但是随着自定义操作的复杂化,正确地调整条件和排序的顺序,您在添加风险时也有可能成为自己最大的敌人。 Custom actions are a leading cause of deployment failure。
Backup / Restore - or "Preserve Values Custom Actions"
:有些人不是使用自定义操作直接编写精确的设置,而是使用自定义操作进行备份,然后还原注册表设置。 -masse在安装结束时。我认为这不是一个好方法。非常笨拙,易于覆盖错误。 Sequencing and conditioning of such custom actions can also become very complicated。
还有其他方法。