我们使用WIX创建了一个MSI。 当我们使用新的MSI(使用新版本)更新软件时,我们希望用更新的文件创建日期覆盖dll,并且我们希望保留某些userconfig xml文件。
我们已应用的wix配置:
Collections.binarySearch(...)
在设置后设置文件删除。<RemoveExistingProducts After="InstallFinalize" />
强制安装程序不要覆盖某些文件。<Component NeverOverwrite="yes">
强制安装程序覆盖某些文件。我们设法通过应用上面的1和2来使安装程序强制文件不被覆盖。 我们如何设法使安装程序强制文件覆盖?以上3个选项并不能解决我们的问题。
感谢您的回答!
答案 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没有文件版本概念。