我正在使用使用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”。确认声明中的路径是否正确,以及该文件是否存在于磁盘上。
我在我的应用中安装了以下构建包:
我在论坛中看到的关于此错误的标准建议是在构建服务器上安装Visual Studio,但我在本地执行此操作并且安装了Visual Studio。我还读到MSBuild 15没有附带WebApplication.targets文件。 toolsVersion
的构造函数上还有一个Microsoft.Build.Execution.BuildRequestData
参数,我尝试手动设置为14.0
,但似乎我的应用程序仍在尝试使用MSBuild 15.(我确实有已安装MSBuild 14。)
问题:
csproj
文件的情况下以编程方式在MSBuild 14中运行此构建?WebApplication.targets
?解决方案:
非常感谢@ Leo-MSFT我能够让这个工作。方法如下:
在我的构建器应用程序中,将此属性添加到我的BuildRequestData
实例中,以使MSBuild查看v15使用的文件夹,而不是使用v14使用的文件夹。
["MSBuildExtensionsPath32"] =
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild"
答案 0 :(得分:1)
我是否可以在不更新任何csproj文件的情况下以编程方式在MSBuild 14中运行此构建?
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" />
但我不确定是否会引入其他错误(未经测试)。
我在哪里可以获得MSBuild 15的WebApplication.targets?
MSBuild 15的WebApplication.targets
路径为:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications