2011-01-20 150 views
16

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

现在我试着升级到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文件资源文件,并将它们编译成卫星组件。我正在使用makefile编译来执行此操作,手动运行resgen(我认为这是因为我找不到将sattelite程序集编译为独立解决方案的方法),然后将它们编译为DLL(I不记得现在如何工作,但我认为这是手动运行AL.exe从资源文件编译DLL文件)。所以基本上我只需要运行命令行来构建这个项目,而我似乎无法找到一个合理的方式来完成这个任务,而不会抛出整个项目并编辑TFS构建脚本来运行一堆硬编码的命令行代替。有一个更好的方法。

我一直在这一整天,并试图写我自己的.targets文件和.xml属性表来代替标准文件,但它是我的头。我试图简单地删除这些行,但是MSBuild抱怨没有“构建”目标。我试图给vcxproj文件添加一个虚拟文件,但是它似乎没有运行完成所有工作前的构建前和构建后步骤。

+0

看起来这个问题已经在这里得到解答:http://stackoverflow.com/questions/3043294/how-to-build-a-vs2010-c-project-on-a-buildserver什么是正确的方式来更新/删除这个问题? – BlueMonkMN 2011-01-20 14:20:26

回答

15

Microsoft Windows SDK 7.1有几个安装选项。即使没有包含任何C++代码(仅包含预构建和后构建步骤),只有“.NET开发”子项“工具”选中后,显然还不足以构建vcxproj项目。添加“Visual C++编译器”选项并完全选择“Intellisense and Reference Assemblies”复选框可以安装必要的文件和设置。我不确定是否有必要,但是这种组合对我来说确实有效。

2

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

  1. 复制在C这些文件:\ Program Files文件,其中VS2010安装在系统上(X86)\的MSBuild \ Microsoft.Cpp \ V4.0 - 检查他们到源代码控制,它们是作为部分检索工作区:
    • Microsoft.Build.CPPTasks.Common.dll
    • Microsoft.BuildSteps.targets
    • Microsoft.Cl.Common。道具
    • 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的末尾,注释掉“< VCMessage Code =”MSB8008“.../>”行和以下相关的<导入>。
  7. 试错,运行命令行编译,看看还有什么我可能已经忘记提及。我认为这是最重要的。
1

一种以改进的BlueMonkMN替代方法是添加

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

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

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

这会减少入侵并且比改变很多行更容易恢复。

+1

您是否还需要在计算机上的某个位置安装这些Microsoft *文件? – BlueMonkMN 2011-08-20 13:06:26

0

一个甚至与添加的环境变量用于VCTargetsPath更简单的方法:

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