Visual studio 无法使用VS 2019构建web应用程序
我安装了VS 2019 Pro,并尝试编译我们的解决方案,以实现以下目标:Visual studio 无法使用VS 2019构建web应用程序,visual-studio,msbuild,visual-studio-2019,Visual Studio,Msbuild,Visual Studio 2019,我安装了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, t
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
因此,VS2019实际上加载了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:\>
C:\>cat“C:\Program Files(x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Microsoft.VisualStudioVersion.v15.Common.props”
15
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
C:\>
因此,最后的VSToolsPath
是C:\ProgramFiles(x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VisualStudio\v15.0
,这显然是错误的,因为不存在这样的目录。现有的是v16.0
无论如何,所有这一切的根本原因似乎是c:\ProgramFiles(x86)\Microsoft Visual Studio\2019\Professional\MSBuild
向世界传达了MSBuild 15是要使用的版本,而不是MSBuild 16
我错过了什么
我们的项目都包括以下导入声明:
我猜问题的根本原因是您将语句置于VSToolsPath
property的定义之上
在VS2019中创建一个简单的asp.net web应用程序(.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>
因此,如果将语句添加到$(VSToolsPath)的第一个定义之上,如位置1,则会出现此错误。如果将语句添加到$(VSToolsPath)定义下方和Microsoft.WebApplication.targets导入的上方,如位置2,则所有语句都可以正常工作
更新1:
关于导入元素的信息,请参见导入的项目按照导入的顺序进行检查。
更新2:
来自标记的提示,我在msbuild中发布了一个问题 对我来说,以下方法奏效了
在csproj文件中
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" />
被替换为
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" />
您可以选择删除语句
或将其移动到正确的位置,但不能移动到xx.csproj文件的最上面。不确定为什么需要此语句,因为在VS2017和VS2019中,创建一个新的web应用程序并检查其项目文件,此语句不是必需的。我需要一点时间来消化您的答案。在生成过程中,msbuild将按照从头到尾(第1行到第2行)的顺序读取xx.csproj。因此,如果您将额外的语句放在VSToolsPath属性的定义之上,这将影响正常的构建逻辑,我认为这会导致这个问题。我不确定您添加该语句的原因,但在VS2017和VS2019中,我认为在项目文件的正常结构中没有必要添加该语句。然后,解决问题的简单方法是删除该语句。我从代码中删除了
,并确保每个项目都导入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。因此,这就是为什么您的声明可能在2015年、2017年VS2015年VS2019年VS2019年VS2019年VS2019年VS2015年VS2019年VS2019年VS2019年VS2019年VS2019年VS2019年VS2019年VS2019年VS2019。我会将此问题发布到DC或github/msbuild,然后在更新中共享链接:)谢谢您的回复。
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> <!--This is where the error finally occurs.-->
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" />