NuGet props文件是什么,它有什么用途?

23

我搜索并阅读了很多内容,但找不到一个确定的答案来解释“nuget.props”文件是什么以及它的用途。

能否给出一些例子并进行解释?


你是指 nuget.g.props 吗?还是你在其他地方找到了 nuget.props?如果是的话,在哪里找到的? - zivkan
nuget.props文件是Package.props文件,当构建NuGet包时可以将其包含在NuGet包中。 - Kartik150
1个回答

48

首先介绍一些背景信息,.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样式项目实际上只是基本上是语法糖,用于完成完全相同的事情。

接下来,MSBuild和.NET团队使构建系统具有可扩展性。因此,您不再局限于Microsoft内置的C#编译器/构建系统,可以替换构建系统的部分内容或添加其他内容。没有NuGet,要做到这一点,您需要在某个地方创建自己的.props和.targets文件,然后编辑您的.csproj并添加语句。如果您的props和targets与使用它的内容在同一个源代码存储库中,则可以正常工作,但是否则编辑csproj并硬编码路径到props和targets文件就行不通了。
NuGet可以帮助解决这个问题。如果您使用适当的约定创建一个包,NuGet将确保发现并在构建中使用这些props和targets。对于使用packages.config的项目,NuGet将在安装/升级/卸载时为您编辑csproj。对于使用PackageReference的项目,NuGet将写入一个名为nuget.g.props和nuget.g.targets的文件到中间目录(obj/文件夹),该文件从所有引用的NuGet包中导入所有props和targets文件,并且构建系统使用这些文件。
我能想到的第一个例子是,如果你想使用比系统上安装的.NET编译器更新的版本,则需要这样做。只需引用Microsoft.Net.Compilers包,该包中的.props.targets将替换系统已安装的构建系统中的编译目标/任务,并改为使用来自该包的内容。这使您可以在编译器安装在系统之前使用新的语言功能,或者如果您想确保代码的所有构建都使用相同的编译器,即使不同的开发人员或CI代理安装了不同的版本也可以。
另一个例子可能是预编译脚本。如果您有自己的脚本语言,请创建构建工具将其转换为C#文件,然后编写MSBuild props和targets,在“真正的构建”之前运行以将您的自定义语言转换为C#,将生成的.cs文件保存到中间文件夹中,为这些生成的文件添加MSBuild Compile项,然后C#编译器将与项目中的所有其他.cs文件一起编译它。您需要对MSBuild和.NET构建系统有相当多的了解,但这是可能的。

1
VS2022/.Net6 项目文件是否支持 .props 文件?我有一个 .Net4.x 解决方案,引用了一个包含 .props 文件的 NuGet 包,这个解决方案可以正常工作。但是在将解决方案迁移到 .Net6 后(并使用相同的 NuGet 包),似乎忽略了 props 文件。 - Andrew Stephens
1
是的,这就是像git版本控制和sourcelink这样的包是如何工作的。如果你从packages.config迁移到PackageReference,需要注意的是,只有“直接”包(由PackageReference定义)才会导入包的build/文件。传递性包不会导入build/文件。但是,包作者可以将他们的文件放在buildTransitive/中(文档不太好,但技术上是有文档的),以便传递性和直接引用都使用它。buildTransitive不受packages.config支持,因此支持两种风格变得复杂。 - zivkan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接