从 TFS Build 构建 MSI

Posted

技术标签:

【中文标题】从 TFS Build 构建 MSI【英文标题】:Building MSI from TFS Build 【发布时间】:2012-03-06 01:10:55 【问题描述】:

我正在尝试在 TFS 构建中构建 MSI,方法是使用 DEVENV.exe(因为 MSBUILD 不支持 VSPROJ)。无论如何,我的第一个安装程序项目构建良好,第二个失败。如果我颠倒顺序,同样的事情会发生(即错误不跟随项目)。查看输出,我收到以下错误:

Deserializing the project state for project '[MyProject].dbproj'
[MyProject].dbproj : error  : Error HRESULT E_FAIL has been returned from a call to a COM component.

另外,我明白了:

Package 'Microsoft.VisualStudio.TestTools.TestCaseManagement.QualityToolsPackage, Microsoft.VisualStudio.QualityTools.TestCaseManagement, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' failed to load

看起来好像第一个构建尝试序列化 DB 项目(它说它成功了,但任何地方都没有 DBML 文件)。然后第二个构建尝试反序列化数据库项目并失败。

我尝试过重置环境设置(使用 /resetusersettings 标志)以及使用 /resetskippkgs 标志。没有任何效果。

有什么想法吗?

【问题讨论】:

【参考方案1】:

当您使用 DevEnv 时,您是在构建特定项目(.vdproj 文件),还是构建解决方案?听起来 VS 正试图在构建机器上打开解决方案,但数据库和测试项目系统不存在。

您是否考虑过将您的设置项目移植到 WiX?

【讨论】:

【参考方案2】:

从简单开始。除非您非常熟悉您要解决的问题,否则通常最好在将其作为 TFS 构建的一部分运行之前“手动”尝试。 RDP 进入构建服务器并尝试在命令行运行必要的命令,看看会发生什么。您甚至可以比这更简单,将 RDP 放入构建机器并加载 Visual Studio 并构建它。

底线是,如果您无法在 Visual Studio 中或通过调用 devenv.exe 在命令行中构建它,它将无法作为团队构建的一部分。

作为 TFS 构建的一部分,我正在使用以下 Exec 任务来精确执行您正在执行的操作。所以我知道这行得通。您的平台和配置可能会根据您正在构建的内容而有所不同。这样做的好处是,您将在 C:\Temp\MSIBuildOutputLog.txt 中拥有一个日志文件,您可以分析它以获取更多错误和信息。

<Exec Command="&quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe&quot; &quot;$(PathToSolution)\solution.sln&quot; /Build &quot;Release|Mixed Platforms&quot; /out &quot;C:\Temp\MSIBuildOutputLog.txt&quot;" />

需要注意的重要一点... VS2010 中存在一个错误,当您尝试在命令行使用 devenv.exe 运行 MSI 时,它会导致生成失败。我花了几天时间才找到并弄清楚,但你需要这个修补程序。像魅力一样工作...... http://archive.msdn.microsoft.com/KB2286556

【讨论】:

感谢您提供的信息。如果我只构建一个 MSI,一切正常(所以我知道 TFS/logging/etc. 设置正确。当我 RDP 进入盒子并手动执行命令时,同样的事情会发生。但是我可以通过打开 Visual Studio 并运行它来构建在那里。 根据我个人的经验,通过 Visual Studio 构建和通过命令行 devenv.exe 构建时的行为存在差异,您可能想尝试我提到的修补程序。这是构建服务器上的低风险更改。除此之外...如果您始终可以构建一个 MSI,您可能只想设置两个单独的构建定义(每个 MSI 一个)并完成它。这并不理想,但尝试解决 IDE 模式和命令行模式下的 Visual Studio 功能之间的差异也不理想。 :)【参考方案3】:

其实是部署项目不支持msbuild。 FWIW,这在 Visual Studio 的下一个版本中都已弃用,因此您可能希望现在开始查看 InstallShield Limited Edition 和/或 Windows Installer XML,然后再花太多时间在死胡同、损坏的技术上。这两种替代方案都具有适当的 MSBuild 支持以及许多其他改进。

【讨论】:

【参考方案4】:

采用 WIX (Windows Installer XML) 可能会更好更快,这是 MS 现在建议在 VS/MSBuild/TFSBuild 环境中使用的技术来创建 MSI。

在您的 VS 解决方案中设置和集成相对容易。它使用基于 XML 的文件来描述您的 MSI,并在您编译时使用这些文件来创建您的 MSI。

我会先从http://wix.codeplex.com/下载Wix

安装后,您将能够使用基于 Wix 的项目的 VS2010 集成来创建 MSI。要快速开始,只需将一个新的 Wix 项目添加到您的解决方案并引用您希望将其输出合并到 MSI 中的项目。接下来,您可以运行 Wix 工具包中包含的名为“Heat”的工具,通过扫描您的项目来生成 XML 文件。

获得这些 XML 文件后,将它们添加到您的 Wix 项目并进行编译。

【讨论】:

以上是关于从 TFS Build 构建 MSI的主要内容,如果未能解决你的问题,请参考以下文章

使用 top - 参数从 TFS-API 获取构建

如何配置 tfs build 以在发布构建完成时复制 dll

TFS Build 找不到 Grunt

TFS 构建和 Powershell:如何访问预定义的构建变量

我可以在 Azure 虚拟机上安装 Azure Devops Build Agent 吗?

我可以从 TFS CI Build 更改 VS2010 数据库项目的部署脚本的位置吗