在 WiX 文件中,Name="SourceDir" 指的是啥?

Posted

技术标签:

【中文标题】在 WiX 文件中,Name="SourceDir" 指的是啥?【英文标题】:In WiX files, what does Name="SourceDir" refer to?在 WiX 文件中,Name="SourceDir" 指的是什么? 【发布时间】:2010-12-11 02:19:47 【问题描述】:

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

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

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

【问题讨论】:

TARGETDIR 是你要安装到的地方,SourceDir 是你正在运行的安装包所在的路径:msdn.microsoft.com/en-us/library/aa372452(VS.85).aspx 【参考方案1】:

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

id 为 TARGETDIR 的元素是 Windows 安装程序要求和 是所有目录的根 安装结构

根据MSDN文档TARGETDIR是

根目标目录 安装

同样根据 MSDN,SourceDir 是

包含 源文件柜文件或源文件 安装包树

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

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

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

【讨论】:

感谢您的信息。不过我还是比较困惑。我的理解是 Name 属性应该是真实目录的名称,而“SourceDir”不是。如果你把它关掉,编译器会报错“你必须将 Name 设置为 SourceDir”。 啊!维克斯的奥秘!发现所有的惊喜、矛盾和秘密握手是一次真正的冒险。【参考方案2】:

发件人:http://robmensching.com/blog/posts/2010/1/26/***-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 所说的。”相反,你必须自己做......有些开发者想知道这一切意味着什么。

【讨论】:

可能每个文件有 1 行而不是 6 行。热输出文件充满了 SourceDir,不知道为什么会出现。让我们使用 xml 使简单的文件复制过程变得过于复杂。 那么如何在不手动执行查找和替换的情况下从我的 Heat 生成的 .wxs 片段文件中删除它?相对路径似乎适用于我所有手动添加的组件文件源字段。【参考方案3】:

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

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

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

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

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

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

【讨论】:

据我了解,这个变量是由$(var.SourceDir) 引用的,而Name="SourceDir" 中的SourceDir 是一个不同的实体。

以上是关于在 WiX 文件中,Name="SourceDir" 指的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在wix的子文件夹中添加所有项目

WiX:CopyFile 属性

WIX - 如何将 RemoveFolderEx 与 On="install" / "both" 一起使用?

使用 WiX 自定义操作在安装文件夹中创建文件

在安装过程中,Wix MSI未显示选择“目标文件夹”的屏幕

尽管 .wxi 文件中有变量,但 WiX“未定义的预处理器变量”