什么是 nuget 道具文件,它有什么用?

What is nuget props file and what is it for?

我环顾四周并阅读了很多书,但找不到明确的答案来解释“nuget.props”文件是什么以及它的用途。

任何解释,也许还有一些例子?

从一些背景信息开始,.NET 项目是使用 MSBuild 构建的。 C# 项目的 .csproj 只是一个 MSBuild 项目文件,其文件扩展名按照惯例表明它是 C# 而不是其他语言,但对于 MSBuild 它只是一个项目文件。 MSBuild 只有少数基本类型、属性、项、目标和任务。按照惯例,属性和项目放在扩展名为 .props 的文件中,而任务和目标放在以 .targets 结尾的文件中。这就是为什么如果您查看旧式 csproj 文件,您会看到 <Import Project="path\to\Microsoft.Common.CSharp.props" /><Import Project="path\to\Microsoft.Common.CSharp.targets" />。新的 SDK 样式项目 basically syntactic sugar 做完全相同的事情。

接下来,MSBuild 和 .NET 团队使构建系统可扩展。因此,您可以不局限于 Microsoft 在 C# compiler/build 系统中构建的内容,而是可以替换部分构建系统,或向其中添加其他内容。如果没有 NuGet,执行此操作的方法是在某处创建您自己的 .props.targets 文件,然后编辑您的 .csproj 并添加 <Import ... /> 语句。如果你的 props 和 targets 与正在使用它的东西在同一个源代码存储库中,这可以很好地工作,但是编辑你的 csproj 并对 propstargets 文件的路径进行硬编码,否则效果不佳.

NuGet 可以提供帮助。如果您使用 appropriate conventions 创建包,NuGet 将确保在构建中发现并使用道具和目标。对于使用 packages.config 的项目,NuGet 将在 install/upgrade/uninstall 上为您编辑 csproj。使用 PackageReference 的项目,NuGet 将向中间目录(obj/ 文件夹)写入一个名为 nuget.g.propsnuget.g.targets 的文件,该文件导入所有 propstargets 来自所有引用的 NuGet 包的文件,构建系统使用这些文件。

我能想到的第一个例子是,如果您想使用比系统上安装的版本更新的 .NET 编译器,那么为什么有人会想要这样做。只需引用Microsoft.Net.Compilers包,包中的.props.targets将替换系统安装的构建系统中的compiletargets/tasks,并使用包中的那个反而。这允许您在系统上安装编译器之前使用新的语言功能,或者如果您想要确保代码的所有构建都使用相同的编译器,即使不同的开发人员或 CI 代理有不同版本的东西安装。

另一个例子可能是预编译脚本。如果您有自己的脚本语言,请创建将它们转换为 C# 文件的构建工具,然后编写 MSBuild 道具和目标,将 "real build" 之前 运行 将您的自定义语言转换为 C#,保存生成的 .cs 文件放入中间文件夹,为这些生成的文件添加 MSBuild Compile 项,然后 C# 编译器会将其与项目中的所有其他 .cs 文件一起编译。您需要对 MSBuild 和 .NET 构建系统有一定的了解,但这是有可能的。