包中的 MSBuild .props 和 .targets

除了更传统的程序集,NuGet 包有时可能会向使用该包的项目添加自定义生成目标或属性。 这可以通过在项目的生成文件夹中添加有效的 MSBuild 文件 <package_id>.targets<package_id>.propsContoso.Utility.UsefulStuff.targets)来实现。

生成文件夹

随着 NuGet 的发展,已添加用于生成和其他用途的各种不同的文件夹。

文件夹 NuGet 版本 Use
内部版本 2.5+ 为项目的每个框架生成逻辑。
buildMultiTargeting 4.0+ 针对 outer build 面向多个框架的项目构建逻辑。 仅 PackageReference。
buildTransitive 5.0+ 为资产生成逻辑,使其可传递到任何消耗项目。 请参阅 功能 页。 仅 PackageReference。

框架特定的构建文件夹

所有 3 个生成文件夹都遵循相同的模式,根据项目目标框架决定最合适的文件。

根生成文件夹中的文件, build/<package_id>.targetsbuild/<package_id>.props 被视为适合所有目标框架。

若要提供特定于框架的文件,请首先将它们放在相应的子文件夹中,例如:

    \build
        \netstandard1.4
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets
        \net462
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets

请尽量使用特定于框架的生成文件夹,以避免包可能不支持的项目中的误报安装。

请注意,如果一个包在 libref 文件夹中都没有文件,而只在框架特定的构建文件夹下有文件,则该包将被视为与所有项目兼容。 包工具的最新版本会在创建此类包时引发 NU5127 警告。

使用包含构建文件的包的项目

PackageReference 项目

.props.targets 不会添加到项目文件,而是通过 {projectName}.nuget.g.targets{projectName}.nuget.g.props 来提供。 运行还原时自动生成这些文件。

当项目面向多个框架时,导入这些文件的条件取决于目标框架名称。

可以将多框架目标的 MSBuild .props.targets 文件放在 \buildMultiTargeting 文件夹中。 生成导入时,将设置一个条件,即 MSBuild 属性 $(TargetFramework) 为空。

packages.config 项目

NuGet 安装包含\build文件的包时,它会在项目文件中添加指向.targets.props文件的MSBuild <Import>元素。 (.props 在项目文件的顶部添加; .targets 在底部添加)。为每个目标框架添加单独的条件 MSBuild <Import> 元素。

使用 MSBuild 属性和目标创建包

可以使用以下任一工具将 MSBuild .props.targets 包包含在包中。

MSBuild 属性和目标的内容指南

NuGet 不会根据包作者和目标项目本身的需求来限制创作.props.targets方式,因为它们会有所不同。

包中的 .props.targets 不能执行某些操作,例如不要指定影响还原的属性和项,因为这些将被自动排除。

  • 不能添加或更新的属性的一些示例:TargetFramework、TargetFrameworkMoniker、TargetPlatformMoniker、AssetTargetFallback 等。

  • 不能添加或更新的项的一些示例:PackageReference、PackageVersion、PackageDownload 等。