WiX:当我将 repititous <ComponentRef> 替换为 Feature 属性时,片段未包含在内

Posted

技术标签:

【中文标题】WiX:当我将 repititous <ComponentRef> 替换为 Feature 属性时,片段未包含在内【英文标题】:WiX: Fragment not getting included when I replace repititous <ComponentRef> with Feature attribute 【发布时间】:2014-04-15 21:02:53 【问题描述】:

我们正在更新一些旧的 WiX 脚本以利用 Feature attribute of components,这样我们就不必在添加或删除组件时在两个位置更新文件(一次添加组件,然后再次将 ComponentRef 添加到 ComponentGroup)。

我们将 WiX 项目分成单独的文件,每个片段一个文件,以使事情更易于管理。但是不再包含我定义功能组件的片段。这听起来与Tomas's issue 在他对功能属性公告的回复中相同。但是,当他使用 Heat 自动生成他的 Wix 文件时,我们正在从头开始手动制作它们。

我尝试在片段的 .wxs 文件中创建一个虚拟属性,然后在 Product 元素的主 .wxs 中引用它。该片段仍未包含在内,我得到了无效的属性 ID。

我们最初尝试使用the strategy described here 来引用组件中的目录,但是虽然这消除了对充满 ComponentRefs 的单独 ComponentGroup 的需要,但它也将我的组件定义与目录树定义分开,这有点违背了只需要查看一个地方进行更新。

我是否需要将所有片段拉入主 Product.wxs 文件以利用 Feature 属性,并避免在每个组件的两个位置更新文件?还是有一种简单的方法可以让片段包含在内?再次使用虚拟属性引用似乎不起作用。

编辑:我想我在构建中发现了问题——我在产品标签下定义了一个目录,然后在片段中定义了一个DirectoryRef,而不是相反。

【问题讨论】:

【参考方案1】:

看看我们如何创作WiX setup itself:在 ComponentGroups 下创作组件,并使用 ComponentGroupRef 将它们拉入功能。这消除了大多数重复。您可以在与您的组件/组件组相同的文件中的片段中创作 Directory 和 DirectoryRef 元素。

【讨论】:

我看到你们使用了我的问题中提到的Directory 属性。因此,没有一种巧妙的方法可以在Directory 下创作Component(以便文件位于其目录上下文中,而不是与目录分开的部分)并使用Feature 属性将它们与功能联系起来?如果我们可以获取包含要包含的组件的片段文件,我们就可以做到这一点。 就像我六年前说过的那样:'正如 Derek 在我遇到同样的问题时告诉我的那样:“父母可以选择他们的孩子,但孩子不能选择他们的父母。”通常有Directory 元素比 Component 元素少,该语言不会针对您想要的创作进行优化。 对--我读过那句话,这是一个很好的引用,但我不应该能够在片段中定义的属性上使用 PropertyRef(例如)拉入片段吗?我不确定为什么包含片段不起作用,或者是否有其他方法可以这样做。只有ComponentRef 会包含片段? PropertyRef 将拉入一个片段。如果它没有连接 Component/@Feature,那是 WiX 链接器中的一个错误。 刚刚使用PropertyRef 作为拉入片段的唯一方法构建了一个最小项目。它虽然有效!这样做有助于我在构建中找到问题——我在产品标签下定义了一个目录,然后在片段中定义了一个DirectoryRef,而不是相反。感谢您的帮助!

以上是关于WiX:当我将 repititous <ComponentRef> 替换为 Feature 属性时,片段未包含在内的主要内容,如果未能解决你的问题,请参考以下文章

Wix Installer Heat.exe 错误 参数“exePath”无效

如何根据wix中的条件设置功能级别?

在 Visual Studio WiX 项目中使用 WXI 文件

Wix 安装程序:验证您是不是有足够的权限来启动系统服务

WiX:升级时替换子目录

Wix Heat 输出没有像我想要的那样引用目录