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 pack
和 nuspec
文件。
- 手动编辑的
nuspec
文件
如果使用的是自定义 nuspec
文件,则建议 lib/
或 ref/
程序集为其而存在的每个 TFM 均有匹配的依赖项组,即使这些依赖项与下一兼容 TFM 的依赖项相同。 例如,如果包含有 netstandard1.0
和 netstandard2.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 pack
和 nuspec
文件。
- 手动编辑
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.targets
将 NoWarn
自动添加到所有项目。