我注意到当我使用类库模板创建项目时,.csproj包含Microsoft.Common.props的导入
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
但是,当我使用“单元测试项目”模板创建项目时,该项目不存在。
那么Microsoft.Common.props是做什么的呢?它如何使项目受益?
最佳答案
它做很多事情,并引入了一部分构建逻辑。
实际上,“标准” .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'项目模板具有用于自定义AfterBuild
目标的注释掉区域的原因。由于AfterBuild
已经通过公共(public)目标进行了定义,因此您需要在导入后覆盖它(或使用自定义名称并添加AfterTargets="AfterBuild"
,这在较新的MSBuild版本中是首选)。
用于默认值和逻辑的.props
/.targets
拆分也用于自定义生成扩展中,并为应在项目的顶部(.props
)和底部(.targets
)导入的msbuild文件命名约定。
在为.NET Core引入但也可以与.NET Framework一起使用的“基于SDK”的项目中,通过分别在项目内容之前和之后导入Sdk.props
和Sdk.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/