netcore:期待 NU1701 但我什么也没得到

netcore: Expecting NU1701 but I get nothing

我正在将大型 net472 应用程序(解决方案中的 130 个项目)转换为 netcoreapp3.0(当前为 preview6)。由于这是一个大型 WIP,逐个项目从 <TargetFrameWork>net472</TargetFrameWork> 更改为 <TargetFrameWorks>net472;netcoreapp3.0</TargetFrameWorks> 多编译(如果还不是 netstandard)。

对于像 System.Data.SQLite.EF6AlphaFS 这样的一些 NuGet 包,我得到 NU1701 "Package was restored using netframework 4.x" 而不是 net core [..]”。 一切正常到目前为止,这是意料之中的。

现在开始解决问题

一些 NuGet 包 -- 幸好都是我几个月前制作的,所以当我发现问题时可以更改 -- 只是不要恢复单个程序集到项目中,因此每个名称空间都丢失了。但仅适用于同一项目的 netcoreapp3.0 构建,该项目可以很好地构建 net472 对应项目。

我删除了 objbin 文件夹,进行了重建:只是没有关于包引用的警告或错误(也没有预期的 NU1701 警告)。

包引用如下(.csproj 文件中没有条件):

    <ItemGroup>
      <PackageReference Include="repacked.xceed.FileSystem" Version="6.2.0.123" ExcludeAssets="contentfiles" />
    </ItemGroup>

obj\project.assets.json 文件显示对于 net472 一切正常,对于 netcoreapp3.0 没有导入任何内容:

{
  "version": 3,
  "targets": {
    ".NETCoreApp,Version=v3.0": {
      "repacked.xceed.FileSystem/6.2.0.123": {
        "type": "package",
        "contentFiles": {
          "contentFiles/any/any/_._": {
            "buildAction": "None",
            "codeLanguage": "any",
            "copyToOutput": false
          }
        }
      }
    },
    ".NETFramework,Version=v4.7.2": {
      "repacked.xceed.FileSystem/6.2.0.123": {
        "type": "package",
        "compile": {
          "lib/net461/Xceed.Compression.Formats.v6.2.dll": {},
          "lib/net461/Xceed.Compression.v6.2.dll": {},
          "lib/net461/Xceed.FileSystem.Windows.v6.2.dll": {},
          "lib/net461/Xceed.FileSystem.v6.2.dll": {},
          "lib/net461/Xceed.Ftp.v6.2.dll": {},
          "lib/net461/Xceed.GZip.v6.2.dll": {},
          "lib/net461/Xceed.SSH.Client.v6.2.dll": {},
          "lib/net461/Xceed.SSH.Core.v6.2.dll": {},
          "lib/net461/Xceed.SSH.Protocols.v6.2.dll": {},
          "lib/net461/Xceed.SSH.SFtp.v6.2.dll": {},
          "lib/net461/Xceed.Synchronization.v6.2.dll": {},
          "lib/net461/Xceed.Tar.v6.2.dll": {},
          "lib/net461/Xceed.Zip.v6.2.dll": {}
        },
        "runtime": {
          "lib/net461/Xceed.Compression.Formats.v6.2.dll": {},
          "lib/net461/Xceed.Compression.v6.2.dll": {},
          "lib/net461/Xceed.FileSystem.Windows.v6.2.dll": {},
          "lib/net461/Xceed.FileSystem.v6.2.dll": {},
          "lib/net461/Xceed.Ftp.v6.2.dll": {},
          "lib/net461/Xceed.GZip.v6.2.dll": {},
          "lib/net461/Xceed.SSH.Client.v6.2.dll": {},
          "lib/net461/Xceed.SSH.Core.v6.2.dll": {},
          "lib/net461/Xceed.SSH.Protocols.v6.2.dll": {},
          "lib/net461/Xceed.SSH.SFtp.v6.2.dll": {},
          "lib/net461/Xceed.Synchronization.v6.2.dll": {},
          "lib/net461/Xceed.Tar.v6.2.dll": {},
          "lib/net461/Xceed.Zip.v6.2.dll": {}
        },
        "contentFiles": {
          "contentFiles/any/any/_._": {
            "buildAction": "None",
            "codeLanguage": "any",
            "copyToOutput": false
          }
        }
      }
[..]

我可能做错了什么到目前为止一直运行良好?

NuGet 对 netcoreapp 框架的兼容性检查从不匹配 .NET Framework tfms,只匹配其他 netcoreapp 版本和 netstandard。在 .NET Core 2.x 和 3.x 中,当包不包含任何兼容资产时,NuGet 将检查 target asset fallback 并再次尝试资产 selection。如果这次找到资产,它会提供 NU1701 警告。

所以,关键是如果它在直接兼容资产 selection 期间没有 select 任何资产,它只会检查目标资产回退。

Content files in the package 使用模式 contentFiles/{lang}/{tfm}/* 其中 {lang} 是项目语言,例如 cs、vb 或 fs,{tfm} 是目标框架.

您的资产文件显示该包至少包含一个位于 contentFiles/any/any 下的文件,这意味着它将有资格 selection 用于您的项目使用的任何语言以及您的项目使用的任何 TFM .因此,当 NuGet 为直接兼容的 TFM 完成其资产 selection 时,它 select 至少有一个 contentFiles 文件。显然,使用目标资产回退的检查发生在排除资产被排除之前,因此您在 csproj 中排除它们并不重要,NuGet 已经决定不需要应用目标资产回退规则。

既然你说你创建了这些包,你应该能够通过将所有 contentFiles/any/any/* 文件移动到 contentFiles/any/net461/* 来解决问题,因为那是你用于 [=] 的同一个 TFM 21=] 文件。这样 NuGet 将找不到任何与 netcoreapp3.0 兼容的内容,并将使用目标资产回退到 select net461 库和内容文件。