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

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

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

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

从: 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所要做的。 相反,你必须自己做…而一些开发者想知道这一切意味着什么。

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

具有ID TARGETDIR的元素是Windows安装程序所必需的,并且是您的安装的所有目录结构的根目录

根据MSDN文档TARGETDIR是

安装的根目标目录

另外根据MSDN, SourceDir是

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

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

但是,由于某些原因,SourceDir在parsingTARGETDIR时完全被忽略。 TARGETDIR必须显式设置(例如在命令行上),否则它将parsing为ROOTDRIVE。 如果ROOTDRIVE没有明确设置,那么它是最可用空间的驱动器的根目录。

一个快速testing表明,安装一个组件到TARGETDIR的确将这些文件放在我的D:\驱动器的根目录下,而不是MSI所在的文件夹。