【问题标题】:Unable to build web applications with VS 2019无法使用 VS 2019 构建 Web 应用程序
【发布时间】:2019-09-09 15:03:23
【问题描述】:

我安装了 VS 2019 Pro 并尝试编译我们的解决方案只是为了得到这个:

error MSB4226: The imported project "C:\Program Files (x86)\Microsoft
 Visual Studio\2019\Professional\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" was not found. Also, tried
 to find "WebApplications\Microsoft.WebApplication.targets" in the fallback search path(s) for $(VSToolsPath) - "C:\Program Files (x86)\MSBuild\Mi
crosoft\VisualStudio\v15.0" . These search paths are defined in "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\
Bin\MSBuild.exe.Config". Confirm that the path in the <Import> declaration is correct, and that the file exists on disk in one of the search paths

这就是它发生的原因:

  1. 我们的项目都包含以下导入声明:&lt;Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.VisualStudioVersion.v*.Common.props" Condition="'$(VSToolsPath)' == ''" /&gt;
  2. MSBuildExtensionsPath = C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild
  3. MSBuildToolsVersion = Current
  4. 文件夹$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)确实存在,见下文。

$(MSBuildExtensionsPath)\$(MSBuildToolsVersion):

C:\> dir "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current"


    Directory: C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        6/13/2019   9:11 PM                Bin
d-----        5/27/2019   4:42 PM                Imports
d-----        5/27/2019   4:41 PM                Microsoft.Common.targets
d-----        5/27/2019   4:42 PM                SolutionFile
-a----        5/27/2019   4:38 PM          13606 Microsoft.Common.props
-a----        5/27/2019   4:38 PM            789 Microsoft.VisualStudioVersion.v15.Common.props
-a----        5/27/2019   4:38 PM           2029 THIRDPARTYNOTICES.txt


C:\>

所以,VS 2019 实际上加载了Microsoft.VisualStudioVersion.v15.Common.props。里面是什么?观察:

C:\> cat "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Microsoft.VisualStudioVersion.v15.Common.props"
<!--
***********************************************************************************************
Microsoft.VisualStudio.v15.Common.props

WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
          created a backup copy.  Incorrect changes to this file will make it
          impossible to load or build your projects from the command-line or the IDE.

Copyright (C) Microsoft Corporation. All rights reserved.
***********************************************************************************************
-->

<Project>

  <PropertyGroup>
    <VisualStudioVersion>15.0</VisualStudioVersion>
    <VSToolsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>

</Project>
C:\>

所以,最后VSToolsPath 是C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VisualStudio\v15.0 这显然是错误的,因为不存在这样的目录。存在的是 v16.0。

无论如何,这一切的根本原因似乎是 c:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild 向世界传达了 MSBuild 15 是要使用的版本而不是 MSBuild 16。

我错过了什么?

【问题讨论】:

  • 您可以选择删除语句&lt;Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.VisualStudioVersion.v*.Common.props" Condition="'$(VSToolsPath)' == ''" /&gt; 或将其移动到正确的位置,但不是xx.csproj 文件的最顶部。不知道为什么你需要这个语句,因为在 VS2017 和 VS2019 中,创建一个新的 web 应用程序并检查它的项目文件,这个语句不是必需的。
  • 我需要一点时间来消化你的回答。
  • 在构建过程中,msbuild会按照从头到尾(line1到end line)的顺序读取xx.csproj。所以如果你把额外的语句放在VSToolsPath属性的定义上面,这会影响正常的构建逻辑,我认为会导致这个问题。我不确定您添加该语句的原因,但是在 VS2017 和 VS2019 中,我认为在项目文件的正常结构中没有必要。那么解决问题的简单方法是删除该语句。

标签: visual-studio msbuild visual-studio-2019


【解决方案1】:

我们的项目都包含以下导入声明:<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.VisualStudioVersion.v*.Common.props" Condition="'$(VSToolsPath)' == ''" />

我猜这个问题的根本原因是你把声明放在VSToolsPath属性的定义之上。

在VS2019中创建一个简单的asp.net web application(.net framework),其结构如下:

<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
  </PropertyGroup>

  <ItemGroup>
    ...
  </ItemGroup>

  <!--Position 1-->
  <!--<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.VisualStudioVersion.v*.Common.props" Condition="'$(VSToolsPath)' == ''" />--> <!--Position 1-->
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> <!--This is where the VSToolsPath is defined.-->
  </PropertyGroup>

  <!--Position 2-->
  <!--<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.VisualStudioVersion.v*.Common.props" Condition="'$(VSToolsPath)' == ''" />--> <!--Position 2-->
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> <!--This is where the error finally occurs.-->
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
  <ProjectExtensions>
    ...
  </ProjectExtensions>
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. ...-->
</Project>

我假设您可以在 xx.csproj 文件的顶部或上方的某个位置添加语句

<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

如果是这样,因为现在 $(VSToolsPath) 还没有定义。它的值为空,然后构建系统将执行您语句中的 Import 元素以导入 $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.VisualStudioVersion.v*.Common.props 文件,这将导致 VisualStudioVersion 属性设置为 15.0 而不是 16.0。

由于它从Microsoft.VisualStudioVersion.v15.Common.props 导入属性,VSToolsPath 现在设置为$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0,这将导致您得到的最终错误,因为Microsoft.WebApplication.targets 文件的路径部分是 $(VSToolsPath) .见:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> <!--This is where the error finally occurs.-->

因此,如果您将语句添加到 $(VSToolsPath) 的第一个定义(如 position 1)之上,您将收到此错误。如果您将语句添加到 $(VSToolsPath) 的定义下方和 Import of Microsoft.WebApplication.targets 上方(如 position 2),则一切正常。

更新1:

关于导入元素的信息见this document。 导入的项目按照导入的顺序进行检查。

更新2:

来自 ma​​rk 的提示,我在 msbuild 中发布了一个问题。 The link.

【讨论】:

  • 我从我们的代码中删除了&lt;Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.VisualStudioVersion.v*.Common.props" Condition="'$(VSToolsPath)' == ''" /&gt;,并确保每个项目都导入 Microsoft.Common.props。但我仍然认为 c:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current 包含目录 15 而不是 16 并且它有一个文件 是一个错误Microsoft.VisualStudioVersion.v15.Common.props
  • @mark 你说得对,应该是xxx.v16.xxx而不是xxx.v15.xxx,我刚查了VS不同版本的文件夹结构,VS2019应该是是 v16.xxx。所以这就是为什么你的陈述可能在 VS2015、2017 中运行良好但在 VS2019 中运行良好的原因。我会将此问题发布到 DC 或 github/msbuild,然后在更新中分享链接:) 感谢您的回复。
【解决方案2】:

对我来说,以下工作。

在csproj文件中,

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" />

替换为

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" />

【讨论】:

  • 为我工作。一个简单的修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多