升级到.NET 4.5后,MSBuild部署失败

Ach*_*khi 47 msbuild msbuild-4.0 .net-4.5

我们最近将VS 2010和.NET 4应用程序升级到VS 2012和.NET 4.5.我们有一个构建脚本来在测试服务器上部署应用程序.我们有两个盒子 - 一个是带有VS 2012的Windows 8(全新安装),另一个是带有VS 2010和VS 2012(新安装)的Windows 7.

从Windows 8运行构建脚本时,框构建脚本运行良好,并将应用程序部署到测试服务器.但是当从Windows 7框中部署应用程序时,我收到以下错误:

"C:\ Achinth\Build\Work\build\qa1sb.proj"(DeployAll target)(1) - >"C:\ Achinth\Build\Work\App\App.csproj"(ResolveReferences; MsDeployPublish target)(2) - >(MSDeployPublish目标) - > C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5):错误:Web部署任务失败.( (8/19/2012 6:23:41 PM)在远程计算机上处​​理请求时发生错误.)[C:\ Achinth\Build\Work\App\App.csproj] C:\ Program Files(x86 )\ MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5):错误:\ r [C:\ Achinth\Build\Work\App\App.csproj] C:\程序文件(x86)\ MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5):错误:(8/19/2012 6:23:41 PM)发生错误时请求已在远程计算机上处​​理.\ r [C:\ Achinth\Build\Work\App\App.csproj] C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft. Web.Publishing.targets(3847,5):错误:应用程序池t 您尝试使用的帽子将'managedRuntimeVersion'属性设置为'v4.0'.此应用程序需要'v4.5'.[C:\ Achinth \建立\工作\软件\ App.csproj]

看看错误,看起来MSBuild正在使用VS 2010目标而不是VS 2012,这导致了错误.由于Windows 8机箱没有VS 2010,因此它正确使用VS 2012目标.

有人可以提供有关如何让MSBuild选择正确版本的指示吗?

Say*_*imi 58

在这种情况下,您需要指定MSBuild属性VisualStudioVersion = 11.0.我刚刚在http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx上发表了关于此的博文,为了您的方便,我已将其粘贴在下面.

Visual Studio 2012最受欢迎的功能之一是能够在VS 2012和VS 2010中打开项目(需要VS 2010 SP1).如果您没有听说我们确实实现了该功能.您可能想知道我们是如何做到这一点以及这可能会对您产生什么影响.

如果为在VS2010中创建的Web项目打开.csproj/.vbproj,您将看到以下import语句.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\
                  v10.0\WebApplications\Microsoft.WebApplication.targets" />
Run Code Online (Sandbox Code Playgroud)

在VS 2012中打开此项目时,对项目文件进行了一些更改,以确保可以在VS 2010 SP1和VS 2012中打开它.在VS 2012中首次加载项目时对项目所做的更改之一是添加以下内容来替换该import语句.

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">
    $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
Run Code Online (Sandbox Code Playgroud)

我们删除了硬编码的10.0,而是使用了属性VisualStudioVersion.在Visual Studio 2012中构建时,此值始终为11.0,但对于VS 2010,它不存在.这就是我们将其默认为10.0以上的原因.在某些情况下,从命令行构建将需要显式设置此属性.在我们到达那里之前让我解释一下这个属性是如何设置的(按此顺序)

  1. 如果将VisualStudioVersion定义为环境变量/全局MSBuild属性,则使用该属性.
    • 这是VS和VS开发人员命令提示符设置此值的方式
  2. 基于.sln文件的文件格式版本(使用的工具集是sln文件格式-1)
    • 为简化此语句,将构建.sln文件,并将VisualStudioVersion指定为创建.sln文件的VS版本的值.
  3. 选择默认值
    • 10.0如果安装了VS 2010
    • 安装了最高版本的子工具集版本

对于#2,当您构建.sln文件时,VisualStudioVersion的值将是.sln文件中找到的Format Version的-1.这里要注意的重要一点是,如果你构建一个.sln文件,它将使用与创建.sln文件的VS版本相对应的VisualStudioVersion值进行构建.因此,如果您在VS2012中创建.sln文件并且始终构建该.sln文件,则VisualStudioVersion的值将为11.0.在许多情况下,如果你构建.sln文件,那么你很好.

如果你正在构建.csproj/.vbproj文件没有通过.sln文件?如果从命令行(而不是开发人员提示)构建Web项目,则使用的VisualStudioVersion值将为10.0.这是我在上面展示的属性的人工制品.在这种情况下,您应该将其作为MSBuild属性传递.例如

msbuild.exe MyAwesomeWeb.csproj /p:VisualStudioVersion=11.0
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我明确地传递了属性.这将始终覆盖任何其他机制以确定VisualStudioVersion的值.如果在构建脚本中使用MSBuild任务,则可以在"属性"属性或"其他属性"属性中指定该属性.请参阅我之前关于Properties和AdditionalProperties之间差异的博客文章.

如果您在构建/发布时遇到任何有趣的行为,并且您注意到正在导入错误的.targets文件,那么您可能需要指定此属性.

  • 添加"/p:VisualStudioVersion=11.0"对我来说不起作用.我正在使用.NET 4.0 MSBuild.exe构建我的VS2012项目,但DLL引用仍然恢复到VS2012版本(我的项目使用Coded UI测试DLL). (2认同)
  • 这个冗长的答案,虽然丰富的信息,但没有帮助我解决这个问题.然而Abhishikt的回答非常有用. (2认同)
  • 我的构建服务器使用TeamCity,没有安装VS2012.所以,添加MSBuild属性"/p:VisualStudioVersion=10.0"对我有用!!! 注意:指定版本10.0,而不是11.0! (2认同)

小智 41

这个链接.

"在文本编辑器中打开*.csproj或*.vbproj Web项目文件,然后添加以下行.

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion> 
Run Code Online (Sandbox Code Playgroud)

我在线前加了一行

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
Run Code Online (Sandbox Code Playgroud)

它没有错误地部署."

它对我有用.

  • 虽然我仍然不明白这个问题,但这对我有用.我的应用程序池(在windows azure上)和我的项目都是针对.net 4.5. (4认同)