Visual Studio 2012解决方案的TeamCity中的MSBuild


72

我有一个要在TeamCity中构建的VS 2012 Web项目/ sln。它使用安装在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>

您的vs2012项目正在导入与VS2012一起安装的msbuild目标文件。除非构建代理在C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications \ Microsoft.WebApplication.targets上具有这些新目标,否则它将不会进行构建
James Woolfenden 2013年

只需将环境变量设置为10.0 VS版本。of 然后工作。
伊恩·温克2013年

Answers:


91

实际上,您不需要在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 Assemblys \ Microsoft \ Framework \ .NETFramework \ v4.6

.NET 4.5.2:

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

.NET 4.5.1:

  • C:\ Program Files(x86)\参考程序集\ Microsoft \ Framework \ .NETFramework \ v4.5.1

.NET 4.5:

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

.NET 4.0.1:

  • C:\ Program Files(x86)\参考程序集\ Microsoft \ Framework \ .NETFramework \ v4.0.1

.NET 4.0:

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

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

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

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


Visual Studio的许可证是否允许从MSBuild复制?
2013年

1
根据stackoverflow.com/questions/3980909/…,您不需要许可证。我还没有找到正式文件说明这一点,但这似乎一直是Microsoft员工给出的建议(请参见同一页上Sayed Ibrahim Hashimi的回答)。
NightOwl888

4
对于Visual Studio 2013,请将目录v11.0更改为v12.0
Colin Pear

或者,您可以从NuGet获取这些文件:nuget.org/packages/MSBuild.Microsoft.VisualStudio.Web.targets/…。不完全确定是否需要任何csproj修改,或者它是否可以自动处理。
jpmc26

52

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

在此处输入图片说明

Name: env.VisualStudioVersion 
Value: 10.0

注意TeamCity不需要安装VS2012。


这很棒!我遇到了相反的问题-当我需要使用v11时,TC默认为v10。使用env.VisualStudioVersion=11.0有效。谢谢!
Mark Carpenter

但是它确实需要至少将VS2010与Teamcity服务器安装在同一台计算机上,对吗?
Maxim V. Pavlov 2013年

不,不是。VS2012向后兼容VS2010 proj和sln.s
Ian Vink

3
任何人都知道为什么teamcity尝试使用C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0(如果我没有安装的话)?
Geovani Martinez'3

7

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

<!-- 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中“项目”节点下的属性组
  • 利润!

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


3
这是为我工作的方法。有助于防止“它建立在我的工作站上”问题。
jslatts

为避免这样做,我认为这是一种更好的方法,它正在安装Microsoft.Net.Compilers版本,因此您将获得与nuget依赖项相同的MSBuild文件夹结构,并且无需修改csproj。我认为这样做的不利方面是,对于依赖于相同MSBuild版本的解决方案中的每个项目,您都需要进行相同的思考,但是对于您而言,情况是相同的。您如何看待@Matt?
Zinov

6

如上所述这里

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


4

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

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

1
步骤4对我来说真的是非常有用的工作。对于v12.0,请使用Microsoft Visual Studio 2013 Shell(独立)可再发行组件包
P6345uk 2014年

-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.