NuGet 警告 NU5128

方案 1

在 nuspec 和 lib/ref 文件夹的依赖项组中所声明的某些目标框架,在其他位置没有完全匹配项。 请参考以下操作列表:

  • 将 .NETStandard2.0 的依赖项组添加到 nuspec

问题

包中的 lib/<tfm>/ref/<tfm>/ 目录包含警告消息中指定的目标框架名字对象 (TFM) 的至少一个对应文件。 但是,nuspec 文件中不存在针对此 TFM 的依赖项组。 这可能会导致包使用者认为此包与 TFM 不兼容,即使此包没有依赖项也是如此。 如果包具有未声明的依赖项,则使用此包的项目会出现运行时错误。

解决方案

  • 对项目运行 NuGet 的 pack target

如果可能,请使用 NuGet 的 MSBuild pack target,因为它会自动将程序集 TFM 与项目的目标框架中的依赖项组进行匹配。 请注意,项目必须将 PackageReference 用于自己的 NuGet 依赖项。 如果项目使用 packages.config,则需使用 nuget.exe packnuspec 文件。

  • 手动编辑的 nuspec 文件

如果使用的是自定义 nuspec 文件,则建议 lib/ref/ 程序集为其而存在的每个 TFM 均有匹配的依赖项组,即使这些依赖项与下一兼容 TFM 的依赖项相同。 例如,如果包含有 netstandard1.0netstandard2.0 程序集,且两者的依赖项相同,则建议将这两个 TPM 列为具有重复依赖项的依赖项组。

请注意,程序集路径中使用的 TFM 标识符采用与依赖项组中所用 TFM 标识符不同的格式。 警告消息指定了要在依赖项组中使用的正确名称。 如果包不含针对该目标框架的任何依赖项,则请使用空组。 例如:

<package>
  <metadata>
    ...
    <dependencies>
      <group targetFramework=".NETFramework4.7.2" />
    </dependencies>
  </metadata>
  ...
</package>
  • 删除 lib/ref/ 文件

如果不希望包与报告的 TFM 兼容,请修改项目,以免在该 TFM 的对应包中出现 lib/<tfm>/ref/<tfm>/ 文件。 例如,如果警告显示将针对 .NETFramework4.7.2 的依赖项组添加到 nuspec,则从包中删除所有 lib/net472/*ref/net472/* 文件。

方案 2

在 nuspec 和 lib/ref 文件夹的依赖项组中所声明的某些目标框架,在其他位置没有完全匹配项。 请参考以下操作列表:

  • 为 netstandard2.0 目标框架添加库或引用程序集

问题

nuspec 文件具有所报告目标框架名字对象 (TFM) 的对应依赖项组,但在 lib/ref/ 中不存在针对此 TFM 的程序集。 如果存在针对兼容 TFM 的程序集,此包仍会安装,但编译时使用的程序集的依赖项可能不正确,且可能导致项目在运行时期间失败。

解决方案

  • 对项目运行 NuGet 的 pack target

如果可能,请使用 NuGet 的 MSBuild pack target,因为它会自动将程序集 TFM 与项目的目标框架中的依赖项组进行匹配。 请注意,项目必须将 PackageReference 用于自己的 NuGet 依赖项。 如果项目使用 packages.config,则需使用 nuget.exe packnuspec 文件。

  • 手动编辑 nuspec 文件

将报告的 TFM 添加为项目要为其进行编译的其他目标框架,并将这些程序集添加到包中。 如果使用 SDK 式项目来多次面向多个 TFM,NuGet 的 MSBuild pack 目标可自动在正确的 lib/<tfm>/ 文件夹中添加程序集,并创建具有正确 TFM 和依赖项的依赖项组。 如果使用的是非 SDK 式项目,则可能需为其他 TFM 创建附加项目文件,并修改 nuspec 文件以在包中的正确位置复制输出程序集。

  • 添加空的 _._ 文件

如果包不含任何程序集(如元包),请考虑将空 _._ 文件添加到警告消息中所列 TFM 的对应 lib/<tfm>/ 目录。 例如,如果警告显示要为 netstandard2.0 目标框架添加程序集,则请在包中创建一个空 lib/netstandard2.0/_._ 文件。

  • 删除依赖项组

如果使用自定义 nuspec 文件,请删除所报告 TFM 的对应依赖项组,从而只保留 lib/<tfm>/ref/<tfm>/ 文件为其而存在的 TFM 的对应依赖项组。

  • 删除与程序集无关的包的所有对应依赖项

如果包不含任何 lib/ 文件或 ref/ 文件且不是元包,则它可能没有任何包使用者所需的依赖项。 如果使用 NuGet 的 MSBuild pack target 进行打包,则可在项目文件中的任意 PropertyGroup 中设置 <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>。 如果使用的是自定义 nuspec 文件,请删除 <dependencies> 元素。

  • 其他方案

此警告是在 NuGet 5.3 开发期间添加的,且首先在 .NET Core SDK 3.0 预览版 9 中提供。 NuGet/Home#8583 会跟踪在过多场景中引发警告的问题。 可使用 NoWarn MSBuild 属性(将 <NoWarn>$(NoWarn);NU5128</NoWarn> 添加到项目文件中的任意 PropertyGroup)。 如果有多个项目受到影响,则可使用 Directory.Build.targetsNoWarn 自动添加到所有项目。