netcore:期待NU1701,但我一无所获

时间:2019-07-16 13:25:51

标签: .net .net-core nuget nuget-package-restore

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

对于某些System.Data.SQLite.EF6AlphaFS之类的NuGet程序包,我得到NU1701“使用netframework 4.x还原了程序包”,而不是网络核心[..]”。一切到目前为止,还可以,这是预期的。

现在有问题

一些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
          }
        }
      }
[..]

我可能做错了什么,到目前为止已经运行了好几年?

1 个答案:

答案 0 :(得分:1)

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

因此,关键在于,如果在直接兼容资产选择过程中未选择任何资产,它只会检查目标资产的后备状态。

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

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

由于您说是创建了这些软件包,因此应该可以通过将所有contentFiles/any/any/*文件移动到contentFiles/any/net461/*来解决此问题,因为这与您{{1} }文件。这样,NuGet将找不到与lib兼容的任何内容,并将使用目标资产回退来选择netcoreapp3.0库和内容文件。