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

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

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

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

最佳答案

它做很多事情,并引入了一部分构建逻辑。

实际上,“标准” .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'项目模板具有用于自定义AfterBuild目标的注释掉区域的原因。由于AfterBuild已经通过公共(public)目标进行了定义,因此您需要在导入后覆盖它(或使用自定义名称并添加AfterTargets="AfterBuild",这在较新的MSBuild版本中是首选)。

用于默认值和逻辑的.props/.targets拆分也用于自定义生成扩展中,并为应在项目的顶部(.props)和底部(.targets)导入的msbuild文件命名约定。

在为.NET Core引入但也可以与.NET Framework一起使用的“基于SDK”的项目中,通过分别在项目内容之前和之后导入Sdk.propsSdk.targets文件来扩展此概念。一组约定有助于查找这些文件,甚至允许您通过在项目文件上指定一个属性<Import>来省略<Project Sdk="Microsoft.NET.Sdk">...</Project>元素。这些导入将定义比Microsoft.Common.props更大的默认值,从而允许非常小的和更易于阅读的项目文件。 (当前,仅.NET Core/.NET Standard和ASP.NET Core项目模板使用此格式,因为VS 2017使用的项目系统不同于经典csproj文件)

关于c# - Microsoft.Common.props是做什么的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50069577/

10-13 09:10