MSBuild在Visual Studio 2012解决scheme的TeamCity中

我有一个VS 2012 web项目/ sln,我正在尝试在TeamCity中构build。 它使用安装在TeamCity上的.NET 4.5。

TeamCity服务器只安装了VS 2010

生成运行时出现此错误:

C:\BuildAgent\work\d5bc4e1b8005d077\CUSAAdmin.Web\CUSAAdmin.Web.csproj(799, 3): error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. Project CUSAAdmin.Web\CUSAAdmin.Web.csproj failed. Project CUSAAdmin.sln failed. 

它试图使用Visual Studio 2012(v11.0)来构build。

我已经在build.xml中将VisualStudioVersion设置为10了

  <Target Name="BuildPackage"> <MSBuild Projects="CUSAAdmin.sln" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration); VisualStudioVersion=10.0" /> 

这个项目也是VS2010的默认设置

  <PropertyGroup> <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> 

实际上,您不需要在CI服务器上安装Visual Studio。 您只需将开发机器上的几个文件夹复制到CI服务器上的相同位置即可。

VS 2015:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ WebApplications

VS 2013:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ WebApplications

VS 2012:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications

VS 2010:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ WebApplications

.NET 4.6:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.6

.NET 4.5.2:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5.2

.NET 4.5.1:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5.1

.NET 4.5:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5

.NET 4.0.1:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0.1

.NET 4.0:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0

或者,正如Matt所build议的那样 ,您可以将它们复制到项目的子目录中,并更改MSBuild(通常为.csproj.vbproj )文件中的<MSBuildExtensionsPath32>位置。

一旦你完成了这个,你的项目将被编译。 您仍然应该将VisualStudioVersion明确地设置为您正在使用的VisualStudioVersion,以确保其设置正确。

注意:此解决scheme适用于所有项目types(包括Web项目)。 对于一个网站(没有项目文件),我最终安装了与我正在使用的.NET SDK版本匹配的Windows SDK ,因为缺less导致它不能生成的registry项。

原来这很简单。 为了让MSBuild运行VS2010作为TeamCity中由VS2012制作的解决scheme的构build器,只需设置构buildconfiguration的环境variables,如下所示:

在这里输入图像说明

 Name: env.VisualStudioVersion Value: 10.0 

注意TeamCity不需要安装VS2012。

或者,您可以将所需的构build目标从c:\ Program Files(x86)\ MSBuild复制到项目的子目录(例如。\ Build),确保保留结构并将以下内容添加到csproj中:

 <!-- redirect msbuild path so targets can be added to source control --> <PropertyGroup> <MSBuildExtensionsPath32>..\Build\</MSBuildExtensionsPath32> </PropertyGroup> 

例如,如果我的项目根目录是C:\ Dev \ MyProjSln \ MyProj

  • 创build文件夹C:\ Dev \ MyProjSln \ Build \ Microsoft \ VisualStudio \ version \ WebApplications \
  • 将C:\ Program Files文件(x86)\ MSBuild \ Microsoft \ VisualStudio \ version> \ WebApplications \的内容复制到创build的文件夹
  • 在csproj的Project节点下的Property Group中添加MSBuildExtensionsPath32元素
  • 利润!

就个人而言,我更喜欢跟踪构build目标依赖关系的方法,因为它可以防止构build服务器依赖于具有未公开的文件夹结构需求,并将您的依赖关系存入源代码pipe理

如此处所述:

  • 安装nuget MSBuild.Microsoft.VisualStudio.Web.targets
  • 编辑.csproj文件

更换:

 <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" /> 

有:

 <Import Project="..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" Condition="true" /> 

很明显,你必须确保版本符合你的情况,在安装nuget和<Import>path

我完全不同意更改项目文件,因为这可能会影响其他开发人员。 这是什么为我工作,因为MS生成文件夹上缺lessv11.0文件夹:1)创buildv111。

  1. 在C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio上创buildv11.0文件夹
  2. 从我的开发框“C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0”复制Web和WebApplications文件夹
  3. Booom! 像魅力工作\
  4. 注意:我安装了“Microsoft Visual Studio 2012 Shell(隔离)可再发行组件包”

首先,TeamCity不需要任何版本的Visual Studio来构build。 当使用MSBuild运行器configuration项目中的构build步骤时,TeamCity需要知道要使用哪个版本的MSBuild。 这是一个构build步骤的设置。 根据构build机器上安装的.NET工具,必须在构build步骤configuration中select适当的MSBuild版本。 TeamCity将使用该值来确定位置path,并在调用MSBuild时设置一个环境variables。

Visual Studio 2012/2013的问题是,它只能从TeamCity 8.1.0开始支持。 所以如果你的TeamCity版本在8.1之前。 您需要升级到最新的8.1.x才能看到MSBuild Tools 2013的设置。一旦在构build步骤设置中select了正确的MSBuild版本,问题就会消失。 欲了解更多信息,请阅读这里: http : //blog.turlov.com/2014/07/upgrade-teamcity-to-enable-support-for.html