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\WebApplicationsVS 2013:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplicationsVS 2012:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplicationsVS 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
)文件中的 <MSBuildExtensionsPath32>
位置。
完成此操作后,您的项目将编译。您仍应将 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 和 <Import>
中的路径上的版本与您的情况相匹配
【讨论】:
【参考方案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 2010 项目到 Visual Studio 2012
Visual Studio 2012 - %(Link.OutputFile)