我注意到当我使用类库模板创建项目时,.csproj包含Microsoft.Common.props的导入
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
但是,当我使用单元测试项目模板创建项目时,它不存在。
那么Microsoft.Common.props做了什么?它如何使项目受益?
答案 0 :(得分:14)
它做了很多事情,并带来了构建逻辑的一部分。
事实上,&#34;标准&#34;有两个重要的进口产品。 .NET项目:Microsoft.Common.props
和Microsoft.Common.targets
(后者可能隐含地包含在项目类型特定的导入文件中)。
基本思想是将构建逻辑拆分为两部分,一部分是在项目内容之前导入的(将是.props
),另一部分是之后包含的部分(.targets
)。
Microsoft.Common.props
将根据惯例定义一些属性 - 例如设置当前配置的默认值(例如,如果在从命令行构建时未指定任何配置,则构建Debug
。)
它还导入作为msbuild / vs工具安装或项目的扩展安装的其他文件 - 例如NuGet 4+将此用于PackageReference
样式项目。
一旦Microsoft.Common.props
导入设置了所有默认值,您的项目就会根据用户选择(和项目模板)更改默认值,以及定义所需的其他一些属性和项目用于构建过程。
然后,您的项目必须导入.targets
文件,该文件定义执行项目构建所需的msbuild逻辑。这是通过Microsoft.Common.targets
(以及它选择导入的文件)完成的。
在导入之后需要指定任何需要覆盖来自此文件的逻辑的东西 - 这就是VS&#39;项目模板具有自定义AfterBuild
目标的注释区域。由于AfterBuild
已经通过公共目标定义,因此您需要在导入后覆盖它(或使用自定义名称并添加AfterTargets="AfterBuild"
,这是较新的MSBuild版本中首选的。)
默认值和逻辑的.props
/ .targets
拆分也在自定义构建扩展中使用了很多,并且应该在顶部导入的msbuild文件的命名约定(.props
)和项目的底部(.targets
)。
在&#34;基于SDK&#34;已经为.NET Core引入但也可以与.NET Framework一起使用的项目,这个概念通过导入Sdk.props
和Sdk.targets
文件来扩展 - 分别在项目内容之前和之后。一组约定有助于查找这些文件,甚至允许您通过在项目文件上指定属性来省略<Import>
元素:<Project Sdk="Microsoft.NET.Sdk">...</Project>
。这些导入将定义比Microsoft.Common.props
更多的默认值,从而允许非常小且更易读的项目文件。 (目前,只有.NET Core / .NET Standard和ASP.NET Core项目模板使用此格式,因为VS 2017使用的是与经典csproj文件不同的项目系统)