【问题标题】:Overwrite files based on "Newer version then newer date" rule根据“较新版本然后较新日期”规则覆盖文件
【发布时间】:2013-08-06 04:46:46
【问题描述】:

在 InstallShield 中,它允许我们使用“更新版本然后更新日期”规则覆盖文件。 谁能告诉我可以在 Advanced Installer 中实现这样的功能吗? 谢谢!

【问题讨论】:

  • 这些实际上是 Windows Installer 规则而不是 InstallShield 规则。这也不是对过程的准确描述。欲了解更多信息,请参阅:msdn.microsoft.com/en-us/library/windows/desktop/…
  • “更新版本然后更新日期”在 MSI 出现之前至少是 InstallShield (V3.x/V5.x/V6.x/V7.x) 的一条规则 :-) 80 年代/90 年代。我不确定,如果它们在某些遗留脚本项目类型中幸存下来,我不会使用它们(当然):-) 请参阅下面的答案。

标签: installation windows-installer advanced-installer


【解决方案1】:

我的新答案,尤其是“平等版本”问题。

两种可能的方法:

第一种方法:测试!至少在您发布安装程序之前,将安装结果与源进行比较。总是一个很好的推荐。然后殴打忘记增加版本号的开发人员并说“MSI 要求您进行干净的版本处理。如果没有,您的文件不会覆盖现有的旧版本。”已经这样做了。已经工作了。 (在第一个版本中不需要,但在更新中。)

第二种方法:始终使用带有“e”的属性 REINSTALLMODE。这意味着始终使用文件版本覆盖现有文件(仅限文件级别规则)。例如。您将您的 MSI 硬编码为属性“REINSTALLMODE”,其值为“emus”。这仍然允许您覆盖它,例如对于维修,它应该是“vemus”。更干净的是仅在命令行中设置此属性,但随后您需要 setup.exe 或其他引导程序。

第二种方法更舒服,但现在您失去了一个非常干净的文件版本处理。 如果您在公司的两个不同设置(产品)中有一个共享文件,版本为 1.0,它确实较旧,它将覆盖同样具有 V1.0 的“较新”版本。

如果您没有共享文件,它可以工作。但是您现在确实依赖于安装更新过程的版本管理,因此更重要的是要确保产品 1.1(而不是文件)不能安装在较新的产品版本 1.2 或 2.0 上。

第三种方法(稍后添加):

如果您只在 MSI 中进行重大升级,例如没有补丁,并且您依赖“在安装新版本之前卸载旧版本”策略(例如 InstallShield 中的默认设置),那么“通常”在某些情况下,您将永远不会出现过度安装文件的情况(就像没有共享文件一样)。如果这样做,请勿使用 MS 的 merge moduls,除非您是专家。

没有更好的选择。

【讨论】:

  • 感谢您的热情回复。这些 cmets 真的帮了我很多。
【解决方案2】:

此选项在高级安装程序中不可用,但您可以选择始终覆盖机器上存在的文件,请参阅Operations tab

【讨论】:

  • 有没有办法在 Advanced Installer 中模拟这个功能?例如编写一个自定义脚本来完成这项工作?
  • 恐怕不行,使用 Advanced Installer 构建的 MSI 软件包遵循文件版本控制规则(上面 Christopher 链接的文章),您无法修改。
【解决方案3】:

我从这里可能的最佳答案开始:不关心。 MSI 在这里遵循非常充分的默认规则,如果它们不适合您的情况,您很可能必须更改策略;您的要求不是最佳实践、危险、存在矛盾等......

更详细:

1) 如果文件有版本,则不用关心设置。关心开发(构建/CM)过程。最好是确保每次编译文件时都将文件版本设置得更高。奇怪的是,很少有公司能实现这个简单的目标......

2) Windows 安装程序文件中包含的文件的最后更改日期在 MSI 中并不重要,这是一个非常好的决定!日期通常是非常糟糕的鉴别器。最有趣的例子是当您的 V1.0 修补程序比 V2.0 更新时 - 是的,有时需要支持旧版本行。 :-) 所以,忘记日期。经验法则是:未版本化的文件通常会被覆盖(有一些您首先不需要知道的明显例外)。

3) 您必须更详细地告诉我们,您的问题是什么(如果有的话),或者除了默认行为之外您还想实现什么??!例如。您是否在使用“相同版本”覆盖或设置后用户编辑的文件时遇到问题?

--

4) 完整的详细信息,仅在感兴趣的情况下:在 MSI 中,文件覆盖规则对所有文件都是全局的,这对于“旧”设置/脚本开发人员来说有点可怕,但它有效,你必须改变你的住所位。

高级安装程序只是 MSI (Windows Installer) 的 GUI 包装器,所以首先你必须对 MSI 有一点了解。

这是 MSDN 上关于 MSI 文件覆盖的全部故事,称为“文件版本控制规则” http://msdn.microsoft.com/en-us/library/windows/desktop/aa368599(v=vs.85).aspx

与往常一样,MS 在 MSI 文档中做得非常准确。这是 MSI 中最好的事情之一..(内幕笑话)。

如果您阅读了该链接的所有小节,我认为对于大多数人来说似乎相当复杂。一旦理解,它就像往常一样简单。

【讨论】:

  • 3) 我关心的问题是,以前的开发人员可能会在编辑后忘记更新文件的版本(例如 DLL 文件)。如果他不这样做,我仍然可以比较文件的修改日期,以确定是否覆盖。
  • 正如我所说,文件日期太弱了。一位同事将文件与 Outlook 一起邮寄:日期已更改。将文件放在服务器上,如果您将其复制回来,有时时间会发生变化。 NTFS 和 FAT 具有不同的时间分辨率,如果涉及 Linux 服务器,则更是如此。当我做补丁时,Windows 对夏令时感到困惑。如果你多年来开始收集,所有这些场景,很多,有些很奇怪,有些至少是确定性的,但并不广为人知。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多