Microsoft.Common.props做了什么

use*_*956 6 c# msbuild csproj

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

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

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

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

Mar*_*ich 16

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

事实上,对于"标准" .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已经通过公共目标定义,因此您需要在导入之后覆盖它(或者使用自定义名称并添加AfterTargets="AfterBuild"在较新的MSBuild版本中首选).

默认值和逻辑的.props/ .targetssplit也在自定义构建扩展和msbuild文件的命名约定中使用了很多,这些文件应该在项目的top(.props)和bottom(.targets)中导入.

在为.NET Core引入的"基于SDK的"项目中,也可以与.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文件不同的项目系统)

  • 您的解释非常清楚,帮助我解决了构建问题 (3认同)