在WiX文件中,Name =“SourceDir”是指什么?

时间:2009-10-29 01:09:27

标签: wix windows-installer wix3

WiX文件似乎总是包含这一行:

<Directory Id="TARGETDIR" Name="SourceDir">

什么是“SourceDir”?它是干什么用的?它不是真正的目录名称。它有某种神奇的价值吗?

3 个答案:

答案 0 :(得分:86)

来自:http://robmensching.com/blog/posts/2010/1/26/StackOverflow-what-does-NameSourceDir-refer-to

老实说,这是我们应该从开发者那里隐藏的东西,但却没有。抱歉。问题的真相是,Windows Installer希望目录树始终植根在主键(Directory / @ Id)为“TARGETDIR”且DefaultDir列(Directory / @ Name)为“SourceDir”的目录行中。

在安装过程中,TARGETDIR将默认为计算机上最大的驱动器。 SourceDir将设置为MSI执行的位置。现在,SourceDir在初始安装后很棘手,因为除非调用ResolveSource操作,否则不会设置它。但是,您不希望显式调用ResolveSource操作,因为它可能会提示您提供原始源媒体(请:请插入CD)。

我们在WiX工具集中应该做的是删除指定TARGETDIR / SourceDir对的需要,并说“没有父节点的任何目录元素将自动成为TARGETDIR的父级,因为这就是MSI SDK所要做的。”相反,你必须自己做...而且一些开发者想知道这一切意味着什么。

答案 1 :(得分:21)

从wix.chm文档中,主题“如何:向安装程序添加文件”主题:

  

ID为TARGETDIR的元素是   Windows Installer和   是所有目录的根目录   您的安装结构

根据MSDN文档TARGETDIR

  

的根目标目录   安装

同样根据MSDN,SourceDir

  

包含的根目录   源文件柜文件或源文件   安装包的树

所以SourceDir属性指向一个真实的目录:MSI文件所在的目录。使用msiexec /lvx* installer.log installer.msi进行安装时,您可以在安装程序日志中看到此信息。

但是,由于某种原因,在解析TARGETDIR时完全忽略了SourceDir。必须明确设置TARGETDIR(例如在命令行上),否则它将解析为ROOTDRIVE。如果未明确设置ROOTDRIVE,则它是具有最多可用空间的驱动器的根。

快速测试表明,将组件安装到TARGETDIR确实会将文件放在我的D:\驱动器的根目录下,而不是MSI所在的文件夹。

答案 2 :(得分:2)

这些对我来说都没有用。我发现这个线程想知道如何进行Debug构建,我的源文件(安装程序中的文件)可以从我试图制作的项目的“Release”构建目录或“Debug”构建目录中提取安装程序。

经过一些grepping,我找到了wixproj文件中的实际路径,SourceDir定义为:

<SourceDir>$(SolutionDir)distribution\Release</SourceDir>

与安装文件和项目文件无关。我能够添加另一个镜像现在指向我的调试文件的发布组的PropertyGroup:

<SourceDir>$(SolutionDir)distribution\Debug</SourceDir>

希望这有助于某人。我知道这有点偏离主题,但希望它能帮助将来的某个人。不确定项目插件为什么不暴露这个值?或者我错过了吗?