在撰写本文时,我正在使用 Visual Studio 2017 (ver15.6.6) 和 .NET Framework ver4.7.02558 (MSBuild ver15.5.x),即最新更新。当我使用默认模板创建 ASP.NET Web 项目时,生成的 .csproj 文件包含以下代码段:
<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)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
如您所见,Microsoft.WebApplication.targets 被导入了两次。我在 .csproj 的这个块上摸不着头脑:
- 首先,由于 Condition="false",第二个条目被禁用(我在这里遗漏了什么吗?)所以这引出了一个问题,首先处理这个 import 语句是什么?
- 第二个语句指向 v10.0 而不是 v15.0。Errrr wooOt?不应该是v15.0吗?
第三点:
< VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0< / VisualStudioVersion>
应该是:
< VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0< /VisualStudioVersion>
出于测试目的,我注释掉了第一个语句并启用了第二个语句,如下所示:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" Condition="true" />
这似乎在我的开发机器和我们拥有的无头 CI 服务器中都可以正常工作。我之所以提到这一点,是因为如果使用默认的 \v10.0\,那么构建系统会以一种非常深奥的方式中断:
在我们的 CI 服务器中,网络发布机制静默地无法在输出文件夹中生成任何内容,同时它也不会产生任何错误(哎呀!)。
这是一个已知问题,似乎影响了许多用户。在此处查看 rianjs 的答案:
https://github.com/Microsoft/msbuild/issues/1901
他得出了和我一样的结论。我无法理解为什么 VS17 的默认模板没有内置规定来解决默认构建系统中的这些微妙之处,如上图所示。
.csproj 的所有这些默认设置似乎都离我们很远,完全具有误导性,并且构成了各种奇怪、无声和难以弄清楚的错误的电池。尤其是在 CI 服务器方面。
为了使用默认模板解决这些问题,我是否需要通过插件或其他东西分别更新 Visual Studio 的模板以获得 VS17 的健康模板?这里发生了什么?