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.EF6
或 AlphaFS
这样的一些 NuGet 包,我得到 NU1701
"Package was restored using netframework 4.x" 而不是 net core [..]”。 一切正常到目前为止,这是意料之中的。
现在开始解决问题
一些 NuGet 包 -- 幸好都是我几个月前制作的,所以当我发现问题时可以更改 -- 只是不要恢复单个程序集到项目中,因此每个名称空间都丢失了。但仅适用于同一项目的 netcoreapp3.0 构建,该项目可以很好地构建 net472 对应项目。
我删除了 obj
和 bin
文件夹,进行了重建:只是没有关于包引用的警告或错误(也没有预期的 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
库和内容文件。
我正在将大型 net472 应用程序(解决方案中的 130 个项目)转换为 netcoreapp3.0(当前为 preview6)。由于这是一个大型 WIP,逐个项目从 <TargetFrameWork>net472</TargetFrameWork>
更改为 <TargetFrameWorks>net472;netcoreapp3.0</TargetFrameWorks>
多编译(如果还不是 netstandard)。
对于像 System.Data.SQLite.EF6
或 AlphaFS
这样的一些 NuGet 包,我得到 NU1701
"Package was restored using netframework 4.x" 而不是 net core [..]”。 一切正常到目前为止,这是意料之中的。
现在开始解决问题
一些 NuGet 包 -- 幸好都是我几个月前制作的,所以当我发现问题时可以更改 -- 只是不要恢复单个程序集到项目中,因此每个名称空间都丢失了。但仅适用于同一项目的 netcoreapp3.0 构建,该项目可以很好地构建 net472 对应项目。
我删除了 obj
和 bin
文件夹,进行了重建:只是没有关于包引用的警告或错误(也没有预期的 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
库和内容文件。