首页 > 解决方案 > WiX 引导程序 UI 未从 TFS 构建定义编译

问题描述

我的解决方案中有一个 WiX 捆绑安装程序。它由几个 MSI 项目和引导程序 UI 项目组成。当一次全部建成时,一切正常。

有了对所有内容进行身份验证的新要求,我试图将程序集编译与安装程序编译分开,这样我就可以在两者之间登录。

我正在尝试使用两个单独的构建配置来做到这一点。一个只构建应用程序程序集,另一个只构建安装程序项目。当我从视觉工作室手动运行它们时,它们都可以正常工作。

问题是当我尝试从 TFS 构建定义中的单独任务调用它们时。包括引导程序 UI 在内的程序集都在第一个任务中成功编译。但在第二个仅安装程序任务中,WiX 项目将尝试重新编译引用的引导程序 UI 项目,并因缺少类型或命名空间错误而失败。

我尝试从仅安装程序构建配置中包含和删除 boostrapper UI 项目。无论哪种情况,我都会遇到相同的错误。启动底层引导程序 UI 构建的是 wixproj 本身。

标签: tfsmsbuildwix

解决方案


好的,我认为这就是您想要做的,请在评论中纠正我,我可以相应地完善答案。

听起来您有一个解决方案,当在一个配置(例如,代码)中构建时,它只会编译 .net 项目,而在另一个配置(例如,包)中,它只构建 WIX 项目。我认为这种分离是问题的一部分。

从您的描述中,听起来 wix 项目也有对其他代码项目的项目引用(最有可能用于收集有效负载 - 但至少,建立构建依赖顺序)。

任何引用另一个项目的项目(wix 或代码)将自动导致该项目构建 - 在没有解决方案配置的情况下,它将默认使用与主项目相同的配置。这意味着如果项目 A 有一个名为 CODE 的配置并且项目 B 引用了一个名为 PACKAGE 的配置引用它,那么构建项目 B 将导致 A 尝试使用配置 PACKAGE 构建 - 如果它没有这个配置,那么它(成功) 将无法构建,然后项目 A 将无法找到它期望的依赖项。

在您的解决方案中,您应该有两种配置,其中一种是另一种的超集。因此,仅用于构建代码的 CODE 配置是用于构建 wix 项目的 PACKAGE 配置的子集。当您在配置管理器中进行设置并构建解决方案时,您可以保证项目使用正确的配置构建,而不是从主节点推断配置。

然后,您可以将其作为一个来完成,而不是在 TFS 构建中执行两个构建步骤。如果您仍然需要拆分它(因为您对中间的程序集进行了数字签名),那么请知道 msbuild 通过比较输入与输出的时间戳来进行增量构建。这意味着如果您构建项目 A 然后对其进行数字签名,则构建项目 B(引用 A)将尝试构建项目 A,但它将确定 A 的输出比输入更新并且不会替换程序集。最终,这意味着您可以安全地在配置 CODE 下构建解决方案,对程序集进行签名,然后在配置 PACKAGE(它是 CODE 的超集)下再次构建解决方案,而无需替换已签名的程序集。

在相关说明中,wix 目标文件具有挂钩点,可将捆绑包作为 wix 项目构建的一部分进行签名。这可能比事后尝试使用 PowerShell 签名要好。


推荐阅读