如何在 Wix 的重大升级中让 PathwaysMDF 和 LDF 覆盖旧副本?

Posted

技术标签:

【中文标题】如何在 Wix 的重大升级中让 PathwaysMDF 和 LDF 覆盖旧副本?【英文标题】:How to have PathwaysMDF and LDF overwrite old copies on a major upgrade of Wix? 【发布时间】:2011-02-16 01:46:39 【问题描述】:

我需要这两个文件 PathwaysMDF 和 PathwaysLDF 在重大升级时替换(覆盖)旧副本。

好的,这个 WiX 快把我逼疯了。设置文件完美运行,但数据库文件仍然无法正常工作!我尝试了几种方法...

以下是使用注册表项尝试执行此操作的代码:

<Component Id="Database" Guid="1D8756EF-FD6C-49BC-8400-299492E8C65D" >
<RegistryValue Root="HKLM" Key="Software\TDR\Pathways\Database" Name="installed" Type="integer" Value="1" KeyPath="yes" />
<File Id="pathwaysMdf" Name="Pathways.mdf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.mdf" />
<File Id="pathwaysLdf" Name="Pathways_log.ldf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.ldf"/>
</Component>

这会导致旧的 LDF 文件剩余,而 没有 MDF 文件在完成后,不是旧的,也不是新的。

以下是日志中关于该尝试的内容: (完整日志http://pastebin.com/a8a7uKfL)

MSI (s) (C8:80) [09:01:51:845]: Executing op: SetTargetFolder(Folder=C:\Documents and Settings\All Users\Application Data\Pathways) MSI (s) (C8:80) [09:01:51:845]: Executing op: SetSourceFolder(Folder=1\ykpqggg9\Pathways\|CommonAppData\Pathways) MSI (s) (C8:80) [09:01:51:845]: Executing op: FileCopy(SourceName=x_gekdq7.ldf|Pathways_log.ldf,SourceCabKey=pathwaysLdf,DestName=Pathways_log.ldf,Attributes=512,FileSize=40239104,PerTick=32768,,VerifyMedia=1,,,,,CheckCRC=0,,,InstallMode=58982400,HashOptions=0,HashPart1=-403787921,HashPart2=771061375,HashPart3=-1732951415,HashPart4=-1390528611,,) MSI (s) (C8:80) [09:01:51:845]: File: C:\Documents and Settings\All Users\Application Data\Pathways\Pathways_log.ldf; Won't Overwrite; Won't patch; Existing file is unversioned but modified MSI (s) (C8:80) [09:01:51:845]: Executing op: FileCopy(SourceName=Pathways.mdf,SourceCabKey=pathwaysMdf,DestName=Pathways.mdf,Attributes=512,FileSize=156368896,PerTick=32768,,VerifyMedia=1,,,,,CheckCRC=0,,,InstallMode=58982400,HashOptions=0,HashPart1=570808063,HashPart2=-1571218748,HashPart3=-867678845,HashPart4=601212343,,) MSI (s) (C8:80) [09:01:51:845]: File: C:\Documents and Settings\All Users\Application Data\Pathways\Pathways.mdf; Won't Overwrite; Won't patch; Existing file is unversioned but modified

以下是使用伴随文件(主程序可执行文件,已版本化)尝试执行此操作的代码:

<Component Id="Database" Guid="1D8756EF-FD6C-49BC-8400-299492E8C65D" >
<File Id="pathwaysMdf" Name="Pathways.mdf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.mdf" CompanionFile="pathwaysExe" />
<File Id="pathwaysLdf" Name="Pathways_log.ldf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.ldf" CompanionFile="pathwaysExe" />
</Component>

这样做的结果是 LDF 文件表现完美,用新文件替换旧文件,但是 MDF 文件已消失。旧的和新的一样,不见了。

以下是日志中关于该尝试的内容: (完整日志http://pastebin.com/gijLN5QY):

MSI (s) (C8:F8) [09:21:55:206]: Executing op: SetCompanionParent(ParentPath=C:\Program Files\Pathways\,ParentName=Pathways.exe,ParentVersion=1.1.5.0,ParentLanguage=0) MSI (s) (C8:F8) [09:21:55:206]: Executing op: FileCopy(SourceName=Pathways.mdf,SourceCabKey=pathwaysMdf,DestName=Pathways.mdf,Attributes=512,FileSize=156368896,PerTick=32768,,VerifyMedia=1,,,,,CheckCRC=0,Version=pathwaysExe,,InstallMode=58982400,,,,,,,) MSI (s) (C8:F8) [09:21:55:236]: File: C:\Documents and Settings\All Users\Application Data\Pathways\Pathways.mdf; Overwrite; Won't patch; Existing file is of an equal version (Checked using version of companion: C:\Program Files\Pathways\Pathways.exe) MSI (s) (C8:F8) [09:21:55:236]: Source for file 'pathwaysMdf' is compressed InstallFiles: File: Pathways.mdf, Directory: C:\Documents and Settings\All Users\Application Data\Pathways\, Size: 156368896 MSI (s) (C8:F8) [09:21:55:246]: Re-applying security from existing file. MSI (s) (C8:F8) [09:21:55:246]: Verifying accessibility of file: Pathways.mdf MSI (s) (C8:F8) [09:21:55:266]: Note: 1: 2318 2: C:\Documents and Settings\All Users\Application Data\Pathways\Pathways.mdf MSI (s) (C8:F8) [09:21:55:266]: Note: 1: 2360 MSI (s) (C8:F8) [09:21:55:266]: Note: 1: 2360

我还尝试将 MDF 文件设置为没有 CompanionFile 标记的 KeyPath="yes"。这也行不通。

【问题讨论】:

【参考方案1】:

在我看来,WiX 的升级设计确实存在很大缺陷。应该发生的是,默认情况下,每个文件都应该“始终替换”任何内容。只有标有适当属性的文件才应考虑进行版本控制和其他考虑。

WiX 似乎设计用于仅安装 .exe 和 .dll 或其他明确已知的具有版本文件的文件。这很不幸,因为如果它实际上被设计为一种通用的安装机制,它可以更有效并阻止很多人浪费时间。

【讨论】:

【参考方案2】:

尝试删除数据库组件中的 RemoveFile 条目。他们告诉安装程序仅在卸载时删除,升级时,该过程是 UPGRADINGPRODUCTCODE 而不是 UNINSTALL。此外,如果你想删除不是由安装程序创建的文件,你只需要 removefile 条目,(或者如果你想控制发生的事情,比如只在升级时删除等)

总之试试这个

  <Component Id="Database" Guid="1D8756EF-FD6C-49BC-8400-299492E8C65D">
       <File KeyPath="yes" Id="pathwaysMdf" Name="Pathways.mdf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.mdf" />
       <File Id="pathwaysLdf" Name="Pathways_log.ldf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.ldf" />
   </Component>

编辑 1

如果您遇到这些问题,查看日志总是有用的,要生成日志,请运行以下命令

msiexec /i "\PATHTOSETUP\setup.msi" /l*xv

x 用于额外调试,可能会产生太多噪音,因此您可以排除该开关,但是用于详细的 v 通常非常有用。

如果上述建议无法解决,您可以将日志粘贴到 http://pastebin.com/ 之类的地方

编辑 2

好的。路径mdf 文件是未版本化的。当涉及到升级时间时,Windows Installer 会比较当前和新文件,如果它们都未版本化并且文件已更改,则它假定用户已更改它并因此离开它。此比较是在密钥路径上完成的,在您的情况下是路径mdf 文件。要解决此问题,请创建一个虚拟文件或注册表项作为组件密钥路径。我会建议像注册表项这样的东西

HKLM\Software\YOURCOMPANY\YOURPRODUCT\Database\Isinstalled = 1

【讨论】:

还是不行。 :( 这是带有 xv 选项的日志...pastebin.com/pbFq0F6W 这似乎是相关的部分!现在,如何修复... 执行操作:FileCopy(SourceName=Pathways.mdf,SourceCabKey=pathwaysMdf,DestName=Pathways.mdf,Attributes=512,FileSize=156368896,PerTick=32768,,VerifyMedia=1,, ,,,CheckCRC=0,,,InstallMode=58982400,HashOptions=0,HashPart1=-988646793,HashPart2=1303343803,HashPart3=1319815885,HashPart4=-1582270230,,) MSI (s) (E8:20) [09:10 :38:782]:文件:C:\Documents and Settings\All Users\Application Data\Pathways\Pathways.mdf;不会覆盖;不会打补丁;现有文件未版本化但已修改 啊!我尝试将 CompanionFile="pathwaysExe" 添加到 MDF 和 LDF 文件中......现在,MDF 文件在升级过程中消失了!新日志,详细,但没有 x。 pastebin.com/Gfp4ervK 我已经更新了问题以显示尝试过的不同方法...我仍然很难过...还有什么想法吗? :)

以上是关于如何在 Wix 的重大升级中让 PathwaysMDF 和 LDF 覆盖旧副本?的主要内容,如果未能解决你的问题,请参考以下文章

WiX“重大升级”不会在降级时完全安装应用程序

Wix 重大升级,无论文件版本较新,都替换文件

如何获得 Wix Burn 捆绑包以阻止升级

如何实现 WiX 安装程序升级?

WIX:安装应用程序的多个实例并升级应用程序(如果安装在以前安装的位置)

如何使用 WIX 升级数据库?