我一直在尝试设置WiX组件,以便用户可以指定安装程序不应在MajorUpgrade上升级该组件。我有以下代码,但这意味着如果满足条件,则不会安装新版本,但旧版本也会被删除。
<Component Id="ExampleComponent" GUID="{GUID here}">
<Condition>NOT(KEEPOLDFILE="TRUE")</Condition>
<File Id="ExampleFile" Name="File.txt" KeyPath="yes" Source="File.txt"/>
</Component>
理想情况下,如果用户指定&#34; KEEPOLDFILE = TRUE&#34;,则现有版本的&#34; File.txt&#34;应该保留。我已经研究过使用Permanent属性,但这看起来并不相关。
这可以在不使用CustomActions的情况下实现吗?
答案 0 :(得分:1)
然而,更多背景信息会很有用:
如果您的主要升级提前排序(例如afterInstallInitialize),则升级是卸载,然后是全新安装,因此保存文件是一个棘手的主张,因为您要保存它,然后执行新安装,然后恢复它。
如果升级延迟,则在升级过程中会应用文件覆盖规则,因此无论如何都不会替换它。您需要执行诸如创建和修改时间戳相同的操作,以便Windows将使用新的覆盖它。在这种情况下,解决方案是运行以“保留旧文件”为条件的自定义操作,因此您可以执行相反的操作:
并且还不清楚该文件是否总是更新,所以如果实际上它还没有更新那么为什么还要问客户是否要保留它?
https://msdn.microsoft.com/en-us/library/windows/desktop/aa368007(v=vs.85).aspx
然后你可以用文件做你想做的事。如果您已经使用组件guid安装它,那么这个解决方案已经太晚了。
设置像Permanent这样的属性通常不是一个好主意,因为它们不是您可以随意打开和关闭的项目属性 - 它们适用于系统上的组件ID,而永久性意味着永久性。
答案 1 :(得分:0)
我试图将此作为评论,它变得很长。我更喜欢Phil描述的选项4 。数据文件不应由设置干预,而是由其应用程序exe(如果有)在其启动序列期间进行管理。我不知道其他人,但我觉得这是一个重复这个建议的破纪录,但听我们说...
There is a description of a way to manage your data file's overwriting or preservation here。基本上,您更新您的exe以“了解”您的数据文件应该如何管理 - 如果它应该被保留或覆盖,并且您可以根据需要更改每个版本的appliation exe的此行为。链接的线程描述了注册表项,但该概念也可用于文件。
基本上是这样的:
您的设置“永远不会知道”您的数据文件,只有模板文件。在所有情况下,它都会保留您的数据文件。只有它将处理的模板文件。
从设置中解放数据文件有很多优点: