67

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

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

什么是“源目录”?这有什么用途?这不是一个真正的目录名称。这是某种神奇的价值吗?

4

3 回答 3

92

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

老实说,这是我们应该对开发人员隐藏的东西,但没有。对不起。事情的真相是,Windows 安装程序希望目录树始终植根于目录行,其中主键 (Directory/@Id) 是“TARGETDIR”,DefaultDir 列 (Directory/@Name) 是“SourceDir” .

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

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

于 2010-01-27T06:58:08.963 回答
21

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

id 为 TARGETDIR 的元素是 Windows 安装程序所必需的,它是您安装的所有目录结构的根

根据 MSDN 文档TARGETDIR

安装的根目标目录

同样根据 MSDN,SourceDir

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

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

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

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

于 2009-10-29T02:34:46.097 回答
2

这些都对我没有帮助。我发现这个线程想知道如何进行调试构建,我的源文件(安装程序中的源文件)可以从我正在尝试制作的项目的“发布”构建目录或“调试”构建目录中提取安装程序。

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

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

这实际上与安装文件和项目文件无关。我能够添加另一个 PropertyGroup,它反映了现在指向我的调试文件的发布组:

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

希望这可以帮助某人。我知道这有点离题,但希望它对未来的人有所帮助。不知道为什么项目插件不公开这个值?还是我错过了?

于 2018-05-04T01:50:52.507 回答