Microsoft.Common.props做了什么

时间:2018-04-27 20:05:51

标签: c# msbuild csproj

我注意到当我使用类库模板创建项目时,.csproj包含Microsoft.Common.props的导入

<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />

但是,当我使用单元测试项目模板创建项目时,它不存在。

那么Microsoft.Common.props做了什么?它如何使项目受益?

1 个答案:

答案 0 :(得分:14)

它做了很多事情,并带来了构建逻辑的一部分。

事实上,&#34;标准&#34;有两个重要的进口产品。 .NET项目:Microsoft.Common.propsMicrosoft.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.propsSdk.targets文件来扩展 - 分别在项目内容之前和之后。一组约定有助于查找这些文件,甚至允许您通过在项目文件上指定属性来省略<Import>元素:<Project Sdk="Microsoft.NET.Sdk">...</Project>。这些导入将定义比Microsoft.Common.props更多的默认值,从而允许非常小且更易读的项目文件。 (目前,只有.NET Core / .NET Standard和ASP.NET Core项目模板使用此格式,因为VS 2017使用的是与经典csproj文件不同的项目系统)