WIX MSI定义为强制覆盖或永不覆盖文件

时间:2015-11-11 12:39:30

标签: xml wix windows-installer installer

我们使用WIX创建了一个MSI。 当我们使用新的MSI(使用新版本)更新软件时,我们希望用更新的文件创建日期覆盖dll,并且我们希望保留某些userconfig xml文件。

我们已应用的wix配置:

  1. Collections.binarySearch(...)在设置后设置文件删除。
  2. <RemoveExistingProducts After="InstallFinalize" />强制安装程序不要覆盖某些文件。
  3. <Component NeverOverwrite="yes">强制安装程序覆盖某些文件。
  4. 我们设法通过应用上面的1和2来使安装程序强制文件不被覆盖。 我们如何设法使安装程序强制文件覆盖?以上3个选项并不能解决我们的问题。

    感谢您的回答!

2 个答案:

答案 0 :(得分:1)

没有内置&#34;覆盖文件,因为它们是较新的日期&#34; Windows Installer(或其修补程序,Service Pack或其他任何内容)中的功能。规则基于文件版本 - 更高的覆盖更低 - 因此最好的长期解决方案是让您拥有文件版本,并在构建更改的二进制文件时增加它们。然后一切正常。数据文件也是如此。如果在初次安装后更改它们,则不会更换它们。我所知道的每个MSI安装都利用了这两个规则,因为它只是起作用。

https://msdn.microsoft.com/en-us/library/aa367835(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/aa370531(v=vs.85).aspx

因此,您正在发明自己的版本控制/覆盖方案。

如果二进制文件实际上有一个版本,那么WiX将在构建时使用它,尽管DefaultVersion(你没有提到一个禁止文件选项),Windows将在安装时使用它,所以如果你的文件版本化然后将使用版本规则。如果二进制文件根本没有文件版本那么它们将被视为数据文件,因此在这种情况下你应该告诉WiX使用文件散列机制,因为如果传入的文件散列是一个文件散列,Windows将替换数据文件与已安装的文件不同:

https://msdn.microsoft.com/en-us/library/aa370532(v=vs.85).aspx

因此,如果3)是你唯一的问题,如果它们没有文件版本,请使用文件哈希,否则对文件版本撒谎是不安全的。如果您正在安装的文件的实际版本是1.0.0而磁盘上的那个版本也是1.0.0并且您撒谎并且说传入的版本是2.0.0那么您处于文件所在的情况磁盘是1.0.0,MSI中的文件表中的版本是2.0.0。换句话说,Windows Installer可能会注意到已安装的产品已损坏(根据文件表,错误的版本化文件位于磁盘上),并且可能会尝试使用其弹性功能对其进行修复。正如它在这里所说,&#34;正确填充....文件表中的版本...&#34;:

http://blogs.msdn.com/b/heaths/archive/2005/12/02/499495.aspx

因为如果它与磁盘上的文件不匹配,您可能会看到原始源MSI文件的提示。

因此,你不是一个好位置,因为版本说谎不是解决方案,但如果你在二进制文件中根本没有版本,那么文件哈希就会起作用。通常,您应该使用Windows提供的覆盖规则,而不是创建自己的覆盖规则。如果你这样做那么1)更高的二进制版本覆盖较低版本和2)文件更新,因为它们被安装不会被覆盖。使用这些规则将是一种更好的方法。

答案 1 :(得分:0)

有些例外,例如您需要使用MS Access数据库强制覆盖。每次最终用户访问数据库时,它的日期和时间戳都会更改。而且,如果数据库架构确实已更新,那么即使安装的文件可能具有更当前的日期和时间,您仍要覆盖安装的文件。不幸的是,MS Access没有文件版本概念。