WiX文件似乎总是包含这一行:
<Directory Id="TARGETDIR" Name="SourceDir">
什么是“SourceDir”?它是干什么用的?它不是真正的目录名称。它有某种神奇的价值吗?
答案 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>
希望这有助于某人。我知道这有点偏离主题,但希望它能帮助将来的某个人。不确定项目插件为什么不暴露这个值?或者我错过了吗?