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

时间:2012-08-19 13:14:21

标签: msbuild .net-4.5 msbuild-4.0

我们最近将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 target) - > 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:\ Program Files(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):错误:您尝试使用的应用程序池将“managedRuntimeVersion”属性设置为“v4.0”。此应用程序需要'v4.5'。 [C:\ Achinth \构建\工作\ APP \ App.csproj]

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

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

5 个答案:

答案 0 :(得分: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" />

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

我们删除了硬编码的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
    • 安装了最高版本的子工具集版本
  4. 对于#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
    

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

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

答案 1 :(得分:41)

来自this link

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

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion> 

我在行

之前添加了这一行
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

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

它对我有用。

答案 2 :(得分:2)

我观察到当我使用VS2012发布Web部署包功能时,它会生成一个.zip文件。在该zip文件中有一个名为archive.xml的文件,其中包含一个createApp标记,其属性为“managedRuntimeVersion =”v4.0“'。当我使用msdeploy.exe将它同步到iis实例时,它可以工作。

但是,当我使用msbuild.exe创建Web包.zip文件时,它包含一个“managedRuntimeVersion =”v4.5“'的archive.xml。尝试使用msdeploy.exe将此Web包部署到IIS会导致ERROR_APPPOOL_VERSION_MISMATCH错误。

正如Sayed Ibrahim Hashimi在这里解释的那样,将“/p:VisualStudioVersion=11.0”添加到我的msbuild.exe命令行会有效地强制生成Web包的archive.xml中的“managedRuntimeVersion =”v4.0“,以便它解决这个问题。

答案 3 :(得分:2)

对于发现此页面搜索msdeploy / webdeploy显示类似错误的原因的任何人,我发现这是解决方案。

要解决此问题,只需将DeployManagedRuntimeVersion属性添加到VS项目中:

<targetframeworkversion>v4.5</TargetFrameworkVersion></code>
<DeployManagedRuntimeVersion>v4.0</DeployManagedRuntimeVersion>

从这里: http://techblog.dorogin.com/2013/11/deploying-45-projects-with-webdeploy.html

答案 4 :(得分:0)

在我看来,构建服务器上没有安装WebDeploy。所以它引发了类似的错误。我安装了WebDeploy,我很高兴。

http://www.microsoft.com/en-ca/download/confirmation.aspx?id=25230