升级到.NET 4.5后MSBuild部署失败怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (81)

我们最近将VS 2010和.NET 4应用程序升级到VS 2012和.NET 4.5。我们有一个构建脚本来在测试服务器上部署应用程序。我们有两个盒子 - 一个是VS8(全新安装)的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 target) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5): error : Web deployment task failed.((8/19/2012 6:23:41 PM) An error occurred when the request was processed on the remote computer.) [C:\Achinth\Build\Work\App\App.csproj]C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5): error : \r [C:\Achinth\Build\Work\App\App.csproj]C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5): error : (8/19/2012 6:23:41 PM) An error occurred when the request was processed on the remote computer.\r [C:\Achinth\Build\Work\App\App.csproj]C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5): error : The application pool that you are trying to use has the 'managedRuntimeVersion' property set to 'v4.0'. This application requires 'v4.5'. [C:\Achinth\Build\Work\App\App.csproj]

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

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

提问于
用户回答回答于

在这种情况下,将需要指定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 Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\
                  v10.0\WebApplications\Microsoft.WebApplication.targets" />

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

<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)' != ''" />

我们删除了硬编码的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. 选择默认
    • 如果安装了VS 2010,则为10.0
    • 安装了最高版本的子工具箱版本

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

如果正在构建.sproj / .vbproj文件而不通过.sln文件?如果您从命令行(而不是开发人员提示)构建Web项目,则VisualStudioVersion的值将为10.0。这是我上面显示的属性的人造物。在这种情况下,应该将其作为MSBuild属性传入。例如

msbuild.exe MyAwesomeWeb.csproj /p:VisualStudioVersion=11.0

在这种情况下,我明确地传递属性。这将始终覆盖任何其他机制以确定VisualStudioVersion的值。如果在构建脚本中使用MSBuild任务,则可以在“属性”属性或“附加属性”属性中指定该属性。查看我以前的博客文章,了解Properties和AdditionalProperties之间的区别。

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

用户回答回答于

这个链接

“在文本编辑器中打开* .csproj或* .vbproj Web项目文件并添加以下行。

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion> 

我在该行之前添加了该行

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

而且它没有错误地部署。“

它为我工作。

扫码关注云+社区