Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用TFS构建(无VS2010)构建VS2010 MakeFile项目(vcxproj)_.net_Visual Studio 2010_Msbuild_Tfsbuild - Fatal编程技术网

.net 如何使用TFS构建(无VS2010)构建VS2010 MakeFile项目(vcxproj)

.net 如何使用TFS构建(无VS2010)构建VS2010 MakeFile项目(vcxproj),.net,visual-studio-2010,msbuild,tfsbuild,.net,Visual Studio 2010,Msbuild,Tfsbuild,我有一个项目在VS2008中构建得很好,然后我们安装并开始使用TFS构建,然后我们升级到TFS 2010。一切都很好,并且构建正确(在我实现了新的构建过程之后,通过从任何远程VisualStudio2010客户端单击一次构建启动,一切都非常好)。不需要在生成代理上安装Visual Studio。我非常努力(非常努力)不在构建代理上安装VisualStudio,因为我的理解是这是不必要的,而且我们没有许可在非开发机器上安装它 现在我尝试将解决方案升级到VS 2010,仍然以.NET 3.5为目标,

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

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

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(我想这是因为我找不到任何其他方法将卫星程序集编译为独立的解决方案),然后将它们编译成DLL(我不记得现在是如何工作的,但我想它是手动运行AL.exe从资源文件编译DLL文件的)。所以基本上我只需要运行命令行来构建这个项目,而我似乎找不到一个合理的方法来完成它,而不扔掉整个项目并编辑TFS构建脚本来运行一堆硬编码的命令行。一定有更好的办法


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

我设计了一个有点复杂但功能性的解决方案,涉及以下步骤

  • 从安装了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.cppcomon.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
  • 更改vcxproj文件以引用工作区放置这些文件的相对路径,而不是$(VCTargetsPath)
  • 将(所有这些文件中的)行更改为使用AssemblyFile=“Microsoft.Build.CPPTasks.Common.dll”属性,而不是使用assemblyName属性引用此属性
  • 删除新位置根目录下文件中的“$(VCTargetsPath)\”,以便找到其同级文件,而不是尝试引用不存在的VCTargetsPath宏。您可以通过尝试在没有VS 2010的计算机上使用MSBuild运行命令行生成并查看错误消息来查找缺少的实例
  • 类似地,将子目录文件中的$(VCTargetsPath)替换为相对路径
  • 在文件Microsoft.Cpp.Win32.targets的末尾,注释掉“”行和以下相关内容
  • 尝试和错误,运行命令行构建,看看还有什么我可能忘记提到的。我想这就是其中的大部分

  • Microsoft Windows SDK 7.1具有多个安装选项。仅使用“.NET开发”子“工具”检查显然不足以构建VCXPROJ项目,即使它们不包括任何C++代码(仅是预构建和后生成步骤)。添加“VisualC++编译器”选项并完全选择“智能感知和引用程序集”复选框安装必要的文件和设置。我不确定两者是否都有必要,但这种组合确实对我有效。

    BlueMonkMN的一个改进替代方案是添加

    <PropertyGroup>
      <VCTargetsPath Condition="'$(VCTargetsPath)' == ''">[path_to_the_fileset_listed]</VCTargetsPath>
    </PropertyGroup>
    
    
    [列出的文件集的路径]
    
    作为靠近vcxproj顶部的1级儿童

    路径可以包括一个环境变量或其他一些已知的包含变量的路径


    这减少了入侵,并且比更改大量行更容易恢复。

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

  • 找到BlueMonkMN提到的CPP Msbuild文件夹
    • e、 g.
      C:\ProgramFiles(x86)\MSBuild\Microsoft.Cpp\v4.0\V120
  • 打开Windows环境变量
    • 控制面板>系统>高级设置>高级>环境变量