如何在 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 覆盖旧副本?的主要内容,如果未能解决你的问题,请参考以下文章