Visual Studio 2012 解决方案 TeamCity 中的 MSBuild

Posted

技术标签:

【中文标题】Visual Studio 2012 解决方案 TeamCity 中的 MSBuild【英文标题】:MSBuild in TeamCity of Visual Studio 2012 solution 【发布时间】:2013-03-03 09:53:39 【问题描述】:

我有一个 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>

【问题讨论】:

您的 vs2012 项目正在导入与 VS2012 一起安装的 msbuild 目标文件。除非构建代理在 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets 上有这些新目标,否则它不会构建 只需将环境变量设置为10.0 VS版本即可。噗。然后工作。 【参考方案1】:

实际上,您不需要在 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

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

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

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

【讨论】:

Visual Studio 的许可证是否允许从 MSBuild 复制? 根据***.com/questions/3980909/…,您不需要许可证。我没有找到说明这一点的官方文件,但这似乎一直是微软员工给出的建议(参见同一页上 Sayed Ibrahim Hashimi 的回答)。 对于 Visual Studio 2013,将目录 v11.0 更改为 v12.0 或者,您可以从 NuGet 获取这些文件:nuget.org/packages/MSBuild.Microsoft.VisualStudio.Web.targets/…。不完全确定是否需要对 csproj 进行任何修改,或者它是否会自动处理。【参考方案2】:

如here所述:

安装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 和 &lt;Import&gt; 中的路径上的版本与您的情况相匹配

【讨论】:

【参考方案3】:

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

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

【讨论】:

这是适合我的方法。也有助于防止“它建立在我的工作站上”问题。 为了防止这样做,我认为我认为是一种更好的方法,并且正在安装 Microsoft.Net.Compilers 版本,并且您可以获得与 nuget 依赖项相同的 MSBuild 文件夹结构,并且不需要修改csproj。在我看来,这样做的不好的一面是,您需要对解决方案中依赖相同版本的 MSBuild 的每个项目进行相同的思考,但在您的情况下是相同的。 @Matt 你怎么看?【参考方案4】:

首先,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

【讨论】:

【参考方案5】:

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

    在 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio 上创建 v11.0 文件夹 从我的开发框中复制 Web 和 WebApplications 文件夹“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0” 轰隆隆!像魅力一样工作\ 注意:我安装了“Microsoft Visual Studio 2012 Shell (Isolated) Redistributable Package”

【讨论】:

非常好的工作步骤 4 对我来说非常有用。对于 v12.0,请使用 Microsoft Visual Studio 2013 Shell(隔离)可再发行包【参考方案6】:

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

Name: env.VisualStudioVersion 
Value: 10.0

注意 TeamCity 不需要安装 VS2012。

【讨论】:

这太棒了!我遇到了相反的问题——当我需要使用 v11 时,TC 默认使用 v10。使用 env.VisualStudioVersion = 11.0 有效。谢谢! 但它确实需要在与teamcity服务器相同的机器上至少安装VS2010,对吧? 不,它没有。 VS2012向后兼容VS2010 proj和sln.s 如果我什至没有安装 Teamcity,为什么会尝试使用 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0?

以上是关于Visual Studio 2012 解决方案 TeamCity 中的 MSBuild的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2012安装失败

Visual Studio 2010 项目到 Visual Studio 2012

Visual Studio 2012 - %(Link.OutputFile)

Visual Studio 2012 空白解决方案消失

Visual Studio 2012与TFS 2013的兼容性

同一网站的Visual Studio 2012和2017行为