72

我有一个 VS 2012 Web 项目 /sln,我正在尝试在 TeamCity 中构建它。它使用安装在 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.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>
4

6 回答 6

91

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

与 2015 年相比:

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

与 2013 年相比:

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

与 2012 年相比:

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

与 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 建议的那样,您可以将它们复制到项目的子目录中并更改<MSBuildExtensionsPath32>MSBuild(通常为.csproj.vbproj)文件中的位置。

完成此操作后,您的项目将编译。您仍应将 VisualStudioVersion 显式设置为您正在使用的版本,以确保它设置正确。

注意:此解决方案适用于所有项目类型(包括 Web 项目)。对于一个网站(没有项目文件),我最终安装了与我正在使用的 .NET SDK 版本匹配的Windows SDK ,因为缺少导致它无法构建的注册表项。

于 2013-10-14T00:05:41.163 回答
51

事实证明这真的很简单。要使 MSBuild 在 TeamCity 中以 VS2012 生成的解决方案的构建器身份运行 VS2010,只需为构建配置设置环境变量,如下所示:

在此处输入图像描述

Name: env.VisualStudioVersion 
Value: 10.0

注意 TeamCity 不需要安装 VS2012。

于 2013-03-15T15:56:44.490 回答
7

或者,您可以将所需的构建目标从 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

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

就个人而言,我更喜欢这种跟踪构建目标依赖关系的方法,因为它可以防止构建服务器依赖于未记录的文件夹结构要求,并将您的依赖关系纳入源代码控制

于 2014-07-31T14:56:53.690 回答
6

如此处所述:

  • 安装 nugetMSBuild.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>

于 2013-12-12T16:41:45.773 回答
4

我完全不同意更改项目文件,因为这可能会影响其他开发人员。这对我有用,因为 MS 构建文件夹中缺少 v11.0 文件夹:1)创建 v111。

  1. 在 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio 上创建 v11.0 文件夹
  2. 从我的开发框中复制 Web 和 WebApplications 文件夹“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0”
  3. 轰!像魅力一样工作\
  4. 注意:我安装了“Microsoft Visual Studio 2012 Shell (Isolated) Redistributable Package”
于 2014-03-14T09:51:47.707 回答
-1

首先,TeamCity 不需要任何版本的 Visual Studio 来构建。当项目中的构建步骤配置了 MSBuild 运行程序时,TeamCity 需要知道要使用哪个版本的 MSBuild。这是构建步骤的设置。必须根据构建计算机上安装的 .NET 工具在构建步骤配置中选择正确的 MSBuild 版本。TeamCity 将使用该值来确定位置路径,并在调用 MSBuild 时设置环境变量。

Visual Studio 2012/2013 的问题在于它仅受 TeamCity 从 8.1.0 开始的支持。因此,如果您的 TeamCity 版本在 8.1 之前。您需要升级到最新的 8.1.x 才能查看 MSBuild Tools 2013 的设置。在构建步骤设置中选择正确的 MSBuild 版本后,问题就会消失。有关更多信息,请阅读此处:http ://blog.turlov.com/2014/07/upgrade-teamcity-to-enable-support-for.html

于 2014-07-24T15:48:43.847 回答