当前位置: 首页 > 知识库问答 >
问题:

升级到后MSBuild部署失败。NET 4.5

吕永嘉
2023-03-14

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

从Windows 8运行构建脚本时,box构建脚本运行良好,并将应用程序部署到测试服务器。但从Windows 7 box部署应用程序时,我遇到以下错误:

“C:\achith\Build\Work\Build\qa1sb.proj”(部署所有目标)(1)-

查看错误,MSBuild似乎使用的是VS 2010目标,而不是VS 2012,这是导致错误的原因。由于Windows 8 box没有VS 2010,因此它正确地使用了VS 2012目标。

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

共有3个答案

阴高刚
2023-03-14

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

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

正如易卜拉欣·哈希米(Ibrahim Hashimi)在这里解释的那样,将“/p:VisualStudioVersion=11.0”添加到我的msbuild.exe命令行可以有效地强制在生成的web包的archive.xml中使用“managedRuntimeVersion=”v4.0“,从而解决问题。

施锋
2023-03-14

从这个链接。

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

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion> 

我在前面加了一行

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

而且部署时不会出错。”

杨良才
2023-03-14

在这种情况下,您需要指定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以上。在某些情况下,从命令行生成需要显式设置此属性。在我们到达之前,让我解释一下这个属性是如何设置的(按此顺序)

  • 如果VisualStudioVersion定义为环境变量/global MSBuild属性,则使用该属性。
    • 这是VS和VS developer命令提示符设置此值的方式
    • 为了简化此语句,. sln文件将通过将VisualStudioVersion指定为创建. sln文件的VS版本的值来构建。
    • 10.0如果安装了VS 2010
    • 安装的最高版本子工具集版本

    对于#2,当您构建.sln文件时,VisualStudioVersion的值将是.sln文件中格式版本的–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属性中指定该属性。请参阅我上一篇关于属性和AdditionalProperties之间差异的博客文章。

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

 类似资料:
  • “{\”wflyctl0080:Failed services\“=>{\”jboss.deployment.unit.\“yy.war\”WeldStartService\“=>\”启动服务失败,原因是:java.lang.IllegalArgumentException:wflyweld0037:将持久性单元注入CDI托管bean时出错。在部署yy.war中找不到名为“”的持久性单元,用于注入

  • 我最近更新了我的项目的gradle版本,从2.14.1到3.0。从那以后,gradle构建每次都失败,出现以下错误: 错误:原因:org.gradle.api.internal.tasks.defaultTaskinputs$TaskinputUnionFileCollection无法强制转换为org.gradle.api.internal.file.Collections.defaultConf

  • 我最近设置了一个新的WebLogic12C环境。在部署一个我知道在WebLogic11g中工作的应用程序时,我得到了一个错误“web应用程序中的url-pattern/resources/*被映射到了多个servlet”。 它所引用的映射位于正在部署的application.ear中的web.xml中,但只映射了一次: 该项目不包含对url模式/resources/*的任何其他引用,有人能解释重复

  • 问题内容: 我已经将我的Jenkins服务器升级到1.505,但是意外地使用Maven插件构建无法正常工作,并且在Jenkins日志中引发了异常 经过一个小时的搜索,我发现Maven插件家伙升级了他们的代码库,并且由于“可选”依赖项而失败,因此我添加了“可选插件”,但它仍然无声地失败,并且在Jenkins日志中没有任何异常。 错误出现在控制台日志上是 有什么提示吗? 问题答案: 新的maven插件