1

我需要这两个文件 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 文件设置为 KeyPath="yes" 而没有 CompanionFile 标记。这也行不通。

4

2 回答 2

1

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

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

于 2013-08-07T15:47:57.137 回答
0

尝试删除数据库组件中的 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
于 2010-05-06T09:03:45.353 回答