如何使用TFS Build构建VS2010 MakeFile项目(vcxproj)(无VS 2010)

时间:2011-01-20 00:32:52

标签: .net visual-studio-2010 msbuild tfs2010 tfsbuild

我有一个在VS 2008中正常运行的项目,然后我们安装并开始使用TFS Build,然后我们升级到TFS 2010.一切都很好并且构建正确(在我实现了我们的新构建过程之后)从任何远程Visual Studio 2010客户端单击构建启动,一切都非常好。 Visual Studio不需要安装在Build Agent上。我非常努力(非常很难)不在构建代理上安装Visual Studio,因为我的理解是没有必要,而且我们没有许可将它安装在非开发机器上

现在我尝试将解决方案升级到VS 2010,仍然以.NET 3.5为目标,因为它是针对SQL Server CLR过程的程序集,而SQL Server还不支持.NET 4.0。但我根本无法在TFS Build下进行构建。我似乎无法从TFS Build和MS Build命令行获得一致的错误消息,但我认为它与Microsoft.Cpp.Targets不在C:\ Program Files \ MSBuild \中有关,因为我没有没有安装Visual Studio。我确实安装了Microsoft Windows SDK 7.1,这样我就可以为其他一些.NET 4.0项目运行像svcutil这样的.NET 4.0 SDK工具,但似乎没有安装这个构建所需的东西。 TFS构建错误给出的是:

  

C:\ TFSBld [...] \ GenerateLanguage \ GenerateLanguage.vcxproj(46,3):   错误MSB4019:导入的项目   “C:\ Microsoft.Cpp.Default.props”是   未找到。确认路径   声明是正确的,   并且该文件存在于磁盘上。

当我点击该错误时,它会将我带到vcxproj文件中的这一行:

  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

我在这个项目中真正需要做的就是运行resgen从resx文件生成资源文件,并将它们编译成sattelite程序集。我正在使用makefile构建来执行此操作,手动运行resgen(我认为这是因为我无法找到将sattelite程序集编译为独立解决方案的方法),然后将它们编译成DLL(I不记得现在怎么工作,但我认为是手动运行AL.exe从资源文件编译DLL文件)。所以基本上我只需要运行命令行来构建这个项目,我似乎找不到合理的方法来做到这一点而不抛弃整个项目并编辑TFS构建脚本来运行一堆硬编码的命令行代替。必须有更好的方法。

我整天都在这里,并尝试编写自己的.targets文件和.xml属性表来取代标准文件,但它已经超出了我的想象。我试过简单地删除这些行,但是然后MSBuild抱怨没有“Build”目标。我尝试在vcxproj文件中添加一个虚拟对象,但是它似乎没有运行完成所有工作的构建前和构建后步骤。

4 个答案:

答案 0 :(得分:15)

Microsoft Windows SDK 7.1有几个安装选项。仅检查“.NET开发”子项“工具”显然不足以构建vcxproj项目,即使它们不包含任何C ++代码(仅在构建前和构建后步骤)。添加“Visual C ++编译器”选项并完全选择“智能感知和参考组件”复选框将安装必要的文件和设置。我不确定两者是否都是必要的,但这种组合对我有用。

答案 1 :(得分:2)

我设计了一个有点复杂但功能性的工作,涉及以下步骤。

  1. 在安装了VS2010的系统上从C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0复制这些文件 - 将它们检入源代码管理中,以便将它们作为工作区的一部分进行检索:
    • Microsoft.Build.CPPTasks.Common.dll
    • Microsoft.BuildSteps.targets
    • Microsoft.Cl.Common.props
    • Microsoft.Cpp.Default.props
    • Microsoft.Cpp.props
    • Microsoft.Cpp.targets
    • Microsoft.CppBuild.targets
    • Microsoft.CppCommon.targets
    • Microsoft.Link.Common.props
    • Microsoft.MakeFile.targets
    • 平台\的Win32 \ Microsoft.Cpp.Win32.default.props
    • 平台\的Win32 \ Microsoft.Cpp.Win32.props
    • Platfotms \的Win32 \ Microsoft.Cpp.Win32.targets
  2. 更改vcxproj文件以引用工作空间放置这些文件而不是$(VCTargetsPath)的相对路径。
  3. 更改行(在所有这些文件中)以使用属性AssemblyFile =“Microsoft.Build.CPPTasks.Common.dll”,而不是使用AsssemblyName属性引用它。
  4. 删除新位置根目录下的文件中的“$(VCTargetsPath)\”,以便找到其兄弟文件,而不是尝试引用不存在的VCTargetsPath宏。您可以在没有VS 2010的计算机上尝试使用MSBuild运行命令行构建并查看错误消息,从而找到错过的实例。
  5. 同样用相对路径替换子目录文件中的$(VCTargetsPath)。
  6. 在文件Microsoft.Cpp.Win32.targets的末尾,注释掉“&lt; VCMessage Code =”MSB8008“... /&gt;”行和以下相关的&lt; Import&gt;。
  7. 试错,运行命令行构建,看看我可能忘记提及的其他内容。我认为这就是大部分内容。

答案 2 :(得分:1)

BlueMonkMN的改进替代方案是添加

<PropertyGroup>
  <VCTargetsPath Condition="'$(VCTargetsPath)' == ''">[path_to_the_fileset_listed]</VCTargetsPath>
</PropertyGroup>

作为vcxproj顶部附近的1级孩子。

路径可以包含环境变量或包含变量的其他一些众所周知的路径。

这样可以减少入侵,并且比更改大量行更容易还原。

答案 3 :(得分:0)

VCTargetsPath添加环境变量的更简单方法:

  1. 找到BlueMonkMN提到的CPP Msbuild文件夹
    • e.g。 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120
  2. 打开Windows环境变量
    • Control Panel > System > Advanced Settings > Advanced > Environment Variables
  3. 添加一个新的用户变量:
    • 姓名:VCTargetsPath
    • 价值:[您从第1步开始的MsBuild目标路径]
  4. 重新启动Visual Studio。
  5. 完成。你的项目现在应该建立。