Visual studio 缺少MSBuild 15 WebApplication.targets

Visual studio 缺少MSBuild 15 WebApplication.targets,visual-studio,msbuild,Visual Studio,Msbuild,我正在使用一个使用VS2015编写的web应用程序,并正在使用VS2017进行维护。我正在尝试编写另一个应用程序,使用MSBuild API和其他工具在本地构建完整的web堆栈。在VS2015或VS2017中,ASP.NET Web应用程序项目将成功生成,但在以编程方式运行MSBuild时,我不断遇到以下错误: 找不到导入的项目“C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft

我正在使用一个使用VS2015编写的web应用程序,并正在使用VS2017进行维护。我正在尝试编写另一个应用程序,使用MSBuild API和其他工具在本地构建完整的web堆栈。在VS2015或VS2017中,ASP.NET Web应用程序项目将成功生成,但在以编程方式运行MSBuild时,我不断遇到以下错误:

找不到导入的项目“C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets”。确认声明中的路径正确,并且文件存在于磁盘上

我的应用程序中安装了以下生成包:

  • Microsoft.Build
  • Microsoft.Build.Framework
  • Microsoft.Build.Tasks.Core
  • Microsoft.Build.Utilities.Core
我在论坛上看到的关于此错误的标准建议是在构建服务器上安装VisualStudio,但我在本地执行此操作,并且确实安装了VisualStudio。我还了解到MSBuild 15没有随WebApplication.targets文件提供。Microsoft.Build.Execution.BuildRequestData的构造函数上还有一个
toolsVersion
参数,我已尝试手动将其设置为
14.0
,但我的应用程序似乎仍在尝试使用MSBuild 15。(我确实安装了MSBuild 14。)

问题:

  • 我是否可以使此生成以编程方式在MSBuild 14中运行,而不更新任何
    csproj
    文件
  • 在哪里可以获取MSBuild 15的
    WebApplication.targets

解决方案:

在很大程度上要感谢@Leo MSFT,我才能够完成这项工作。以下是方法:

  • 卸载了VS2017 ASP.NET和Web应用程序开发工作负载,然后使用其所有可选组件重新安装。这下载了丢失的.targets文件
  • 在我的生成器应用程序中,将此属性添加到我的
    BuildRequestData
    实例中,以使MSBuild在v15使用的文件夹中查找,而不是在v14使用的文件夹中查找

    [“MSBuildExtensionsPath32”]=
    “C:\ProgramFiles(x86)\Microsoft Visual Studio\2017\Professional\MSBuild”

  • 我是否可以使此生成以编程方式在MSBuild 14中运行,而不更新任何csproj文件

    MSBuildExtensionsPath32
    由MSBuild在内部设置。如果不想更新.csproj文件,可以尝试覆盖项目文件中的值:

      <PropertyGroup>
        <MSBuildExtensionsPath32>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild</MSBuildExtensionsPath32>
      </PropertyGroup>
    
      <PropertyGroup>
        <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
        <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
      </PropertyGroup>
      <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
      <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
      <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
    

    我知道这是目标应该走的道路,但我没有目标。我看到的一般说明是安装Visual Studio,但我认为这不适用于2017版。@JamesFaix,因为您安装了Visual Studio 2017,但没有该目标,您还应该通过安装程序安装工作负载
    ASP.NET和web开发
    。@JamesFaix,在通过安装程序安装ASP.NET和web development工作负载之后,这个问题如何?我刚刚打开安装程序,我已经有了这个工作负载。我将尝试删除它并重新添加。实际上我说得太快了,目标文件现在位于上面提到的目录中(
    ProgramFiles(x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\15.0\WebApplications
    ),但MSBuild正在
    C:\ProgramFiles(x86)中查找该文件\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications
    使用vs_buildtools\uuuuxxx.exe GUI安装程序使用上述建议为我修复了它。我遇到了以下错误“error MSB4057:项目中不存在目标“Package”。@JamesFaix情况如何?我正在使用Jenkins调用MSBuild v15。不完全理解将
    [“MSBuildExtensionsPath32”]
    属性放置在何处?
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications