我环顾四周并且阅读了很多东西,但是找不到一个明确的答案来解释“ nuget.props”文件是什么以及它的用途是什么?
任何解释,也许举一些例子会有所帮助?
答案 0 :(得分:4)
从一些背景信息开始,.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.props" />
的原因。新的SDK样式项目可以basically syntactic sugar进行完全相同的操作。
接下来,MSBuild和.NET团队使构建系统可扩展。因此,您不仅可以替换Microsoft内置于C#编译器/生成系统中的内容,还可以替换生成系统的一部分,或向其中添加其他内容。如果没有NuGet,执行此操作的方法是在某个位置创建自己的.props
和.targets
文件,然后编辑.csproj
并添加<Import ... />
语句。如果您的道具和目标与使用中的道具位于相同的源代码存储库中,则此方法可以很好地工作,但是编辑csproj并将硬编码到props
和targets
文件的路径无法正常工作
NuGet可以帮助您。如果使用appropriate conventions创建一个包,NuGet将确保在构建中发现道具和目标并使用它们。对于使用packages.config
的项目,NuGet将在安装/升级/卸载时为您编辑csproj
。使用PackageReference
的项目,NuGet会将名为obj/
和nuget.g.props
的文件写入中间目录(nuget.g.targets
文件夹),该文件将导入所有props
和{{ 1}}文件中所有引用的NuGet程序包,构建系统将使用这些文件。
我可以想到的第一个示例是为什么有人要执行此操作,如果您要使用比系统上安装的.NET编译器新的版本。只需引用Microsoft.Net.Compilers程序包,该程序包中的targets
和.props
将替换系统安装的构建系统中的编译目标/任务,而改用该程序包中的一个。这样一来,您就可以在系统上安装编译器之前使用新的语言功能,或者即使不同的开发人员或CI代理安装了不同版本的东西,也要确保所有代码版本都使用同一编译器。>
另一个示例可能是预编译的脚本。如果您拥有自己的脚本语言,请创建将其转换为C#文件的构建工具,然后编写将在“实际构建”之前运行的MSBuild道具和目标,以将您的自定义语言转换为C#,保存生成的.targets
文件到中间文件夹中,为这些生成的文件添加MSBuild编译项,然后C#编译器将它与项目中的所有其他.cs
文件一起编译。您将需要相当数量的MSBuild和.NET构建系统的知识,但这是可能的。